Привет всем. Есть маленткое консольное приложение(vs2005):
#include"stdafx.h"int _tmain(int argc, _TCHAR* argv[])
{
for (int i=0; i<10; i++)
{
}
int i=45;
while(1);
}
С точки зрения синтаксиса C++ можно ли определять переменную i ( int i=45; ) после того как она уже была определена в цикле? Дело в том что VS2005 компилирует, но работает с глюком. VS6.0 не компилирует, говорит (multiple initialization). Так как все таки правильно? Глюк VS2005 заключается в том что если поставить точку останова на int i=45; , и сделать шаг на while(1); то в окне watch, i по прежнему будет равно 10, вместо положенных 45, в то же время окно locals будет показывать 45. Как так может быть что у одной и той же переменной 2 разных значения в один момент времени?
09.04.07 06:45: Перенесено модератором из 'Visual Studio 2005 [GDN]' — Odi$$ey
Здравствуйте, Dimitron, Вы писали:
D>С точки зрения синтаксиса C++ можно ли определять переменную i ( int i=45; ) после того как она уже была определена в цикле? Дело в том что VS2005 компилирует, но работает с глюком. VS6.0 не компилирует, говорит (multiple initialization). Так как все таки правильно? Глюк VS2005 заключается в том что если поставить точку останова на int i=45; , и сделать шаг на while(1); то в окне watch, i по прежнему будет равно 10, вместо положенных 45, в то же время окно locals будет показывать 45. Как так может быть что у одной и той же переменной 2 разных значения в один момент времени?
Можно объявлять. Шестерка ведет себя не правильно. Разные цифры — просто глюк вижалки2005, на самом деле все правильно и i == 45.
D>С точки зрения синтаксиса C++ можно ли определять переменную i ( int i=45; ) после того как она уже была определена в цикле? Дело в том что VS2005 компилирует, но работает с глюком. VS6.0 не компилирует, говорит (multiple initialization). Так как все таки правильно? Глюк VS2005 заключается в том что если поставить точку останова на int i=45; , и сделать шаг на while(1); то в окне watch, i по прежнему будет равно 10, вместо положенных 45, в то же время окно locals будет показывать 45. Как так может быть что у одной и той же переменной 2 разных значения в один момент времени?
Если читать Б.Страустропа то там написано что в область вмдимости у переменной объявленной в цикле являться тело цикла . а такие глюки только в продуктах Micro$oft
Здравствуйте, alexst, Вы писали:
A>Если читать Б.Страустропа то там написано что в область вмдимости у переменной объявленной в цикле являться тело цикла . а такие глюки только в продуктах Micro$oft
Не надо гнать на 6 вижалку, это же раритет, долгожитель.
Объекты, объявленные в заголовке цикла, видимы и живут до окончания работы цикла.
тоесть это равносильно: {int i=1; for(; i<10; i++);}
Но это соблюдается далеко не во всех приложениях, в gcc точно работает именно так, а, например, в borland C++ 3.11, в котором мы пишем у универе, переменные объявленые в заголовке цикла видимы и живут после цикла, тоесть равносильно: int i=1; for(; i<10; i++); (без фигурных скобок)
Здравствуйте, NikeByNike, Вы писали:
NBN>Здравствуйте, alexst, Вы писали:
A>>Если читать Б.Страустропа то там написано что в область вмдимости у переменной объявленной в цикле являться тело цикла . а такие глюки только в продуктах Micro$oft
NBN>Не надо гнать на 6 вижалку, это же раритет, долгожитель.
Я не гоню на VS вы сами гонете и спрашиваете почему в этой версии синтаксис такой в этой такой и я незнаю в каком синтаксе писать а давай закроем типа через #ifdef VC5 . . . #endif #ifdef VC6 . . . #endif #ifdef самая крутая VC . . . #endif #ifdef И самая любимая версия моего team leader . . . #endif ( если писать не дома )
Здравствуйте, Dimitron, Вы писали:
D>Глюк VS2005 заключается в том что если поставить точку останова на int i=45; , и сделать шаг на while(1); то в окне watch, i по прежнему будет равно 10, вместо положенных 45, в то же время окно locals будет показывать 45. Как так может быть что у одной и той же переменной 2 разных значения в один момент времени?
Глюк отображения состоит вот в чем: в окне АУТО показываются автоматически переменные, в зависимости от области видимости, что есть корректно. А в ВАТЧ показывается еперменная, которую ты туда притащил за ухо или вписал находясь в области видимости ФОР — скорее у них есть отличие в двух переменных по внутренней идентификации, тогда некорректность в том что они не убирают из показа, видя что переменная покончила свою жизнь.
В общем, можешь смело рапортовать о баге в майкрасофт!
<skipped>
По стандарту правильно, разобрались. Но не все компиляторы знают о стандарте, это надо помнить. И писать так не рекомендуется, так как не красиво
Здравствуйте, ilnar, Вы писали:
I>В общем, можешь смело рапортовать о баге в майкрасофт!
Пойдет в таком виде? Или если надо что то подправить(с английским у меня не очень) то подскажите:
Hi micro$oft. I have a little console application (VS2005 SP1):
#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
for (int i=0; i<10; i++)
{
}
int i=45;
while(1);
}
If set breakpoint on last but one line (while(1)), Whatch window show i=10, Local window show i=45. Why value of i different in Whatch and Local window?
Здравствуйте, Dimitron, Вы писали:
D>Здравствуйте, ilnar, Вы писали:
I>>В общем, можешь смело рапортовать о баге в майкрасофт!
D>Пойдет в таком виде? Или если надо что то подправить(с английским у меня не очень) то подскажите:
вообще, там и русских прудпруди )))
кстати, у меня во вкладке ЛОКАЛ показывает 2 перемнных И (10 и 45), в АУТО 1 (10), в ВАТЧ 1 (10) — это когда я КТРЛ+Ф10 до строки с ВАЙЛ
D>Hi micro$oft. I have a little console application (VS2005 SP1):
D>#include "stdafx.h" D>int _tmain(int argc, _TCHAR* argv[]) D>{ D> for (int i=0; i<10; i++) D> { D> } D> int i=45; D> while(1); D>}
D>If set breakpoint on last but one line (while(1)), Whatch window show i=10, Local window show i=45. Why value of i different in Whatch and Local window?
Здравствуйте, NikeByNike, Вы писали:
F>>равносильно: int i=1; for(; i<10; i++); (без фигурных скобок)
NBN>Кстати, есть стандартный способ решения таких проблем объявлением макроса:
NBN>
#define for if (false) {} else for
Способ хороший, но не очень-то стандартный: если ты определяешь макросы, лексически идентичные ключевым словам, и если включаешь хотя бы один стандартный заголовочный файл, то формально имеешь UB.
Здравствуйте, Roman Odaisky, Вы писали:
RO>Способ хороший, но не очень-то стандартный: если ты определяешь макросы, лексически идентичные ключевым словам, и если включаешь хотя бы один стандартный заголовочный файл, то формально имеешь UB.
Даже если стандартные заголовчные файлы включаются перед всем остальным?
Здравствуйте, vsb, Вы писали:
RO>>Способ хороший, но не очень-то стандартный: если ты определяешь макросы, лексически идентичные ключевым словам, и если включаешь хотя бы один стандартный заголовочный файл, то формально имеешь UB.
vsb>Даже если стандартные заголовчные файлы включаются перед всем остальным?
Даже так:
17.4.3.1.1/2
A translation unit that includes a header shall not contain any macros that define names declared or defined in that header. Nor shall such a translation unit define macros for names lexically identical to keywords.
Я, правда, затрудняюсь представить, как в данном случае (if(0); else for) могут возникнуть какие бы то ни было проблемы.
Здравствуйте, Roman Odaisky, Вы писали:
RO>Здравствуйте, sc, Вы писали:
sc>>И писать так не рекомендуется, так как не красиво
RO>Как «так»?
Как написано
Ну а если покопать, то можно увидеть, что вышеприведенный код не удовлетворяет стандартам кодирования от Саттера/Александреску:
5. Give one entity one cohesive responsibility
(здесь i используется в двух разных местах и имеет разный смысл)
84. Prefer algorithm calls to handwritten loops
(тут все ясно)
Также такой код может в дальнейшем вырасти и нарушить (первую часть):
20. Avoid long functions. Avoid deep nesting