Форум программистов, компьютерный форум CyberForum.ru

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Управление камерой через USB http://www.cyberforum.ru/cpp/thread11657.html
Существует ли библиотека для управления камерой через USB ? (камера Panasonic DVD-юшная)
C++ Чем отличается Visual C++ от Borland C++? мужики у меня тут вопрос я конечно полный нуб еще:eek: а чем отличается Visual C++: от Borland C++ ? вроде ето один и тотже язык программирования http://www.cyberforum.ru/cpp/thread11200.html
Как использовать pascal модуль в TubroC++? C++
Есть модуль, написанный на TurboPascal. Как использовать в приложении на си? Есть возможность сделать из него какую-нибудь библиоткеку, понятную для С? Среда - чистый DOS, не эмуляция.
C++ Как работать с реестром?
Привет! Я должен написать программу, которая не разрешает вставлять дискеты, флэшки, диски в комп. Но подобными вещами пока не занимался. Решил начать с того, что прога будет выдавать сообщение, типа "вы вставили диск..." ну или как-то так... только пока не начал. Если кто-то когда-то писал такое, может что-то посоветуете. Или может подскажете, где хорошо описана работа с реестром, я попробую...
C++ Подскажите сайты с Open Source проектами, в которых можно поучаствовать http://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 Для завершения работы приложения нажмите кнопку "Закрыть".' подробнее

Показать сообщение отдельно
CheshireCat
Эксперт С++
2891 / 1240 / 78
Регистрация: 27.05.2008
Сообщений: 3,340
31.08.2008, 15:21     Циклы for. Проблема объявления/инициализации
Спасибо Vourhey за столь любопытное исследование.
Но, у меня вопрос первый: а зачем нам дизассемблирование? Тот код, который мы получаем в дизассемблере, говорит только лишь о том, что вот так вот это реализовано в данном конкретном компиляторе на данной конкретной ОС... и ничего не говорит о том, что произойдет на другом компиляторе и/или другой ОС/железе.

С моей точки зрения, представляют интерес два вопроса:
1. Что говорит Стандарт - т.е., что должно быть?
2. Как реально ведут себя некоторые современные компиляторы, - т.е. насколько точно они соответствуют Стандарту, либо не соответствуют. Что есть на самом деле?

Итак:
1. Стандарт определяет поведение и область видимости управляющей переменной исчерпывающим образом:
[basic.scope.local] 3.3.2 Local scope
....
4 Names declared in the for-init-statement, and in the condition of if, while, for, and switch statements are local to the if, while, for, or switch statement (including the controlled statement), and shall not be redeclared in a subsequent condition of that statement nor in the outermost block (or, for the if statement, any of the outermost blocks) of the controlled statement; see 6.4.
То есть, утверждение "То есть, она не внутренняя и не скрытая по отношению ко внешнему от цикла миру." мне представляется неверным. Вероятно, мы Vourhey с разошлись в трактовке этого предложения...
2. Из доступных мне компиляторов: (В последние годы я работаю в основном с Microsoft Visual C++....)
а). MS visual C++ 6.0 (1998) не соответствует Стандарту: область видимости управляющей переменной цикла простирается от заголовка цикла до конца объемлющего блока; т.е., код вида
Код
for(int i = 0; i < SOME_VALUE; ++i)
{
    // ... что-то делаем...
}
// ... еще что-то...
i = 20;
cout << i << endl;
// ...
нормально скомппилируется. Ну что ж, VC++ 6 был выпущен еще примерно за полгода до принятия Стандарта, так что с него взятки гладки...
б). MS Visual C++ 7.0 (2002) и 7.1 (2003) занимают промежуточную позицию: по умолчанию включен старый режим, ключ компилятора /Zc:forScope позволяет включить режим точного соответствия Стандарту.
в). MS Visual C++ 8.0 (2005) и последующие по умолчанию точно соответствуют Стандарту; это означает, что приведенный код просто не скомпилируется. Впрочем, все тот же ключ forScope позволяет обеспечить таки совместимость со старым унаследованным кодом и скомпилировать приведенный фрагмент.
г). GCC 4.2.2 (Linux) точно соответствует Стандарту.
 
Текущее время: 21:30. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru