Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
Другие темы раздела
C++ Управление камерой через USB https://www.cyberforum.ru/ cpp/ thread11657.html
Существует ли библиотека для управления камерой через USB ? (камера Panasonic DVD-юшная)
C++ Чем отличается Visual C++ от Borland C++?
мужики у меня тут вопрос я конечно полный нуб еще:eek: а чем отличается Visual C++: от Borland C++ ? вроде ето один и тотже язык программирования
C++ Как работать с реестром? Привет! Я должен написать программу, которая не разрешает вставлять дискеты, флэшки, диски в комп. Но подобными вещами пока не занимался. Решил начать с того, что прога будет выдавать сообщение, типа "вы вставили диск..." ну или как-то так... только пока не начал. Если кто-то когда-то писал такое, может что-то посоветуете. Или может подскажете, где хорошо описана работа с реестром, я попробую... https://www.cyberforum.ru/ cpp/ thread10544.html C++ Подскажите сайты с Open Source проектами, в которых можно поучаствовать Люди дайте пожалуйста ссылки на сайты где есть открытые проекты на С++ в которых можно поучаствовать. Чо та гугл молчок).спс. https://www.cyberforum.ru/ cpp/ thread10540.html
C++ 16-разрядная подсистема MS-DOS
куда надо писать, не знаю, поэтому спрошу тут. ошибка вылазиет не в моей проге, а после того, как последняя скомпилировалась, причем в отдельном окошке: '16-разрядная подсистема MS-DOS Borand c++ for Dos процессор NTVDM обнаружил недопустимую инструкцию. CS:0000 IP:0077 OP:f0 37 05 10 02 Для завершения работы приложения нажмите кнопку "Закрыть".'
C++ Перевести визуализацию WinAmp в полноэкранный режим Как перевести визуализацию винампа в полноэкрнный режим? эмулирование alt+enter и даблклик почемуто не работают HWND h; h=FindWindow("Winamp v1.x", NULL); SendMessage(h,WM_COMMAND,40192,0); h=FindWindow("avswnd", NULL); SetForegroundWindow(h); variant_1 --- SendMessage(h, WM_SYSKEYDOWN, VK_RETURN, 0); --- https://www.cyberforum.ru/ cpp/ thread10448.html
C++ Обработка wave файлов Если у кого исходники или хотя бы идеи по поводу работы с wave файлами средствами С++.К примеру разбиение данных по 20мс,нахождение периода основного тона на этих участках,замещение следующего фрагмента предыдущим.Буду признателен любой помощи! https://www.cyberforum.ru/ cpp/ thread9750.html Проблема с фонтом при старте программы C++
Привет всем. Проблема в следующем. Написал программу на С++ принцип действия в следующем: Имеются два комбобокса в одном из которых я выбираю сервер а в другом выбираю язык русский или английский. При выборе в комбобоксе конкретного сервера в ЛистБоксе приносит список баз, щелкая на которых в ДБГриде приносит результат определенного селекта.Меняя язык в комбобоксе меняется инфа в ДБГриде. Когда...
C++ Анализ данных XML-документа https://www.cyberforum.ru/ cpp/ thread9333.html
Помогите с программой. Нужно считать числовые данные(цена, частота мин, частота макс) из XML-документа в двухмерный массив и записать этот массив в текстовый файл. Вот XML <?xml version="1.0" encoding="UTF-8"?> <headphones id="id1"> <title>Technics</title> <Characteristic amount="24" unit="доллар">Цена</Characteristic> <Characteristic amount="20" unit="герц">Частота мин</Characteristic>...
C++ Функция wait Доброго времени суток. Передо мной встал вопрос на который я не могу дать ответ, может ктонибудь знает. Вопрос: определить, что должно происходить, если вызов wait функции возвращает -1. https://www.cyberforum.ru/ cpp/ thread9194.html
Отслеживание действий мыши C++
Всем привет, хотелось бы сделать хук на мышь, не подскажете литературу или методы существующие Спасибо
C++ Графическая библиотека GD https://www.cyberforum.ru/ cpp/ thread8907.html
Кто-нибудь работал с сабжем? У меня проблема. Глюки с ф-ей gdImageGetPixel() - каждый раз при перезапуске программы она возвращает разные значения одних и тех же пикселов. Не могу понять, в чём дело... Добавлено через 21 час 6 минут Неужели никто не работал с этой либой?
Почетный модератор
7393 / 2639 / 281
Регистрация: 29.07.2006
Сообщений: 13,696
0

Циклы for. Проблема объявления/инициализации - C++ - Ответ 51823

31.08.2008, 03:42. Показов 9076. Ответов 23
Метки (Все метки)

Author24 — интернет-сервис помощи студентам
Эх, так и придется создавать новую тему. А то, блин, интересно ж...
Итак, я тут в недавней теме утверждал, что блок инициализации цикла for является внешним по отношению к его внутреннему блоку (блоку команд, то бишь).
CheshireСat's евангелие не соглашается со мной
Цитата Сообщение от CheshireCat Посмотреть сообщение
Сообщение от Vourhey
Просто переменная объявленная в инициализации цикла считается внешней по отношению к самому блоку цикла. То есть, она не внутренняя и не скрытая по отношению ко внешнему от цикла миру.
Гм. Евангелие 14882-2003 (песнь 3.3.2 стих 4) утверждает иное...
и предлагает открыть для этой байды тему. ОК. Открыл.

С чего возник базар? С того, что нужно, все-таки, выяснить чем же особенны такие конструкции (с объявлением переменных в заголовке цикла):
Код
	for (int i = 0; i < 5; i++)
	{
	}
Не долго думая, надо чапать в листинг дизассемблерный. Вся канитель проводилась в VS 2008. Состряпал такой код:
Код
#include <iostream>

using namespace std;

void main()
{
	int i = 1;
	for (int i = 0; i < 10; i++)
	{
	}
}
В листинге видим следующее:
Код
	int i = 1;
0041138E C7 45 F8 01 00 00 00 mov         dword ptr [i],1   инициализируем i
	for (int i = 0; i < 10; i++)
00411395 C7 45 EC 00 00 00 00 mov         dword ptr [i],0   инициализируем i ту, что в заголовке цикла
0041139C EB 09            jmp         main+37h (4113A7h)    проверяем условие выхода из цикла(cmp dword ptr [i],0Ah)
0041139E 8B 45 EC         mov         eax,dword ptr [i]     три следующие команды - инкремент
004113A1 83 C0 01         add         eax,1 
004113A4 89 45 EC         mov         dword ptr [i],eax 
004113A7 83 7D EC 0A      cmp         dword ptr [i],0Ah     проверка условия выхода
004113AB 7D 02            jge         main+3Fh (4113AFh)    уходим из цикла
	{
	}
004113AD EB EF            jmp         main+2Eh (41139Eh)    цикл
Как видно, обе переменные объявлены вне цикла. По байтам команд видно, что цикл работает с последней объявленной "внешней" переменной.
Уберем инициализацию объявление из заголовка.
Код
#include <iostream>

using namespace std;

void main()
{
	int i = 1;
	for (i = 0; i < 10; i++)
	{
	}
}
Дизассемблер скажет следующее:
Код
	int i = 1;
0041138E C7 45 F8 01 00 00 00 mov         dword ptr [i],1 
	for (i = 0; i < 10; i++)
00411395 C7 45 F8 00 00 00 00 mov         dword ptr [i],0 
0041139C EB 09            jmp         main+37h (4113A7h) 
0041139E 8B 45 F8         mov         eax,dword ptr [i] 
004113A1 83 C0 01         add         eax,1 
004113A4 89 45 F8         mov         dword ptr [i],eax 
004113A7 83 7D F8 0A      cmp         dword ptr [i],0Ah 
004113AB 7D 02            jge         main+3Fh (4113AFh) 
	{
	}
004113AD EB EF            jmp         main+2Eh (41139Eh)
Видно, что теперь он работает с единственной внешней переменной i.

Теперь можно провести небольшой эксперимент:
Код
#include <iostream>

using namespace std;

void main()
{
	int i = 1, *j;
	for (i = 0; i < 10; i++)
	{
		j = &i;
	}
	cout<<"J = "<<*j<<"  I = "<<i<<endl;
	cin.get();
}
Из вышенаписанного должно следовать, что внешняя переменная i будет увеличиваться до 10-ти. Соответственно, в j тоже будет десять. Если скомпилить и выполнить, то результат:
J = 10 I = 10.

А теперь засунем новую переменную В БЛОК цикла:
Код
#include <iostream>

using namespace std;

void main()
{
	int i = 1, *j;
	for (i = 0; i < 10; i++)
	{
		int i; i++;
		j = &i;
	}
	cout<<"J = "<<*j<<"  I = "<<i<<endl;
	cin.get();
}
Какой результат? Внутри цикла будет инкрементироваться переменная i десять раз. В итоге у нас получится ожидаемое:
J = 1 I = 10

И последнее:
Код
#include <iostream>

using namespace std;

void main()
{
	int i = 1, *j;
	for (int i = 0; i < 10; i++)
	{
		j = &i;
	}
	cout<<"J = "<<*j<<"  I = "<<i<<endl;
	cin.get();
}
Если я ошибаюсь и int i = 0 у нас происходит внутри блока цикла, то наша переменная i каждую итерацию должна обнуляться... Посмотрим:
J = 10 I = 1

Ах ты батюшки. Не обнулилась. А не сделала она этого потому что объявлена как вне блока цикла. На уровень выше самого блока команд цикла. И в исполнении цикла строка int i = 0 никакого участия не принимает. Абсолютно.
Если совсем скучно, то можно заглянуть в "Бархатный путь С++":
Дело в том, что тело оператора цикла for (оператор или блок операторов) имеет ограниченную область действия имён. А область действия имени, объявленного в операторе-инициализаторе, оказывается шире этой области.

Заголовок цикла for в C++ - центр управления циклом. Здесь следят за внешним миром, за тем, что происходит вне цикла. И потому все обращения к переменным и даже их новые объявления в заголовке цикла относятся к "внешней" области видимости. Следствием такого допущения (его преимущества далеко не очевидны) является правило соотнесения имени, объявленного в заголовке и области его действия.

По отношению к объявлению переменной в заголовке оператора цикла for, правило соотнесения гласит, что область действия имени, объявленного в операторе инициализации цикла for, располагается в блоке, содержащем данный оператор цикла for.
Вообщем, при должной сноровке и "удаче" можно огрести. Очень редко, но можно. Главное знать, что все, что происходит в заголовке цикла (в области инициализации) - это вне зоны действия его блока. И все эти действия не принимают участия в исполнении операторов цикла.

Дабы, это выглядело, как настоящая тема, вопрос: Где я ошибся? Кто, что думает по этому поводу? Может, в объявлении/инициализации в заголовке цикла нет ничего, на что стоило бы обращать внимание?

P. S. вот именно, блин, поэтому такое использование может принести сюрпризы (это ж какую конструкцию надо придумать), если не знать, как оно работает. Я не утверждаю, что так делать нельзя, или плохо. Так делать можно. Ничего страшного в этом нет абсолютно. Просто надо иметь ввиду.

P. P. S. CheshireСat, что на это скажет твое евангелие?

Добавлено через 28 минут 25 секунд
Кстати, как мне сразу в голову не пришло. Если мы уберем int i; внешний и оставим только в заголовке то:
Код
	for (int i = 0; i < 10;i++)
0041138E C7 45 F8 00 00 00 00 mov         dword ptr [i],0 
00411395 EB 09            jmp         main+30h (4113A0h) 
00411397 8B 45 F8         mov         eax,dword ptr [i] 
0041139A 83 C0 01         add         eax,1 
0041139D 89 45 F8         mov         dword ptr [i],eax 
004113A0 83 7D F8 0A      cmp         dword ptr [i],0Ah 
004113A4 7D 02            jge         main+38h (4113A8h) 
	{
	}
004113A6 EB EF            jmp         main+27h (411397h)
Если сравнить со вторым дизассемблерным листингом, то отличий - 0. Только удалилась строка с присваиванием переменной единицы. А так, все абсолютно идентично. Даже адреса те же.
В итоге мы получили ту же внешнюю по отношению к блоку операторов цикла переменную. Даже с аналогичным адресом То есть, на уровне ассемблера код не меняется. Тот же самый листинг получается из:
Код
. . .
int i;
for (i = 0; i < 10;i++)
{
. . .
Это говорит о том, что такие ситуации аффектятся в случае использования нескольких переменных, манипулирования их адресами и именами.

Вернуться к обсуждению:
Циклы for. Проблема объявления/инициализации C++
3
Заказать работу у эксперта
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
31.08.2008, 03:42
Готовые ответы и решения:

Правила объявления инициализации
Напишите основные - самые главные правила обьявления инициализации.

Отличие объявления, определения и инициализации
Здравствуйте, товарищи. Читаю тут книжицу по C++, учусь потихоньку. И возник у меня вопрос...

проблема в коде задачи на циклы
#include &lt;iostream&gt; using namespace std; int main() { int n; double sum=0;...

Когда выделяется память под переменные - во время объявления или инициализации
Привет! Вопрос такой: когда выделяется память под переменные - во время объявления или...

23
31.08.2008, 03:42
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
31.08.2008, 03:42
Помогаю со студенческими работами здесь

Проблема с ADWORDS: при активности кампании объявления не показываются..
Добрый день. Возникла странная проблема. Была создана кампания в adwords. Она прошла модерацию...

Циклы. Написал программу, но проблема в том, что цикл пробегает всего один раз...
Доброго времени суток. Пишу небольшой парсер для сайта курсов валют. Написал программу, но проблема...

Циклы с условием, циклы с переменной, вложенные циклы
С условием 1. Ввести натуральное число N и вычислить сумму всех чисел фибоначчи меньших N....

Циклы. Напечатать числа в виде таблицы, используя только циклы
Напечатать числа в виде таблицы, используя только циклы (массивы и строки не применять): ...

0
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru