Как правильно? (синтаксис C++)
От: Dimitron Россия  
Дата: 09.04.07 00:22
Оценка:
Привет всем. Есть маленткое консольное приложение(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
Re: Как правильно? (синтаксис C++)
От: NikeByNike Россия  
Дата: 09.04.07 02:54
Оценка:
Здравствуйте, 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.
Нужно разобрать угил.
Re: Как правильно? (синтаксис C++)
От: alexst Россия  
Дата: 09.04.07 03:54
Оценка:
Здравствуйте, Dimitron, Вы писали:

D>Привет всем. Есть маленткое консольное приложение(vs2005):

D>
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>

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
Re[2]: Как правильно? (синтаксис C++)
От: NikeByNike Россия  
Дата: 09.04.07 04:07
Оценка:
Здравствуйте, alexst, Вы писали:

A>Если читать Б.Страустропа то там написано что в область вмдимости у переменной объявленной в цикле являться тело цикла . а такие глюки только в продуктах Micro$oft


Не надо гнать на 6 вижалку, это же раритет, долгожитель.
Нужно разобрать угил.
Re: Как правильно? (синтаксис C++)
От: Fangorn Россия http://fangorn.ru
Дата: 09.04.07 05:02
Оценка:
Здравствуйте, Dimitron, Вы писали:

Объекты, объявленные в заголовке цикла, видимы и живут до окончания работы цикла.
тоесть это равносильно: {int i=1; for(; i<10; i++);}

Но это соблюдается далеко не во всех приложениях, в gcc точно работает именно так, а, например, в borland C++ 3.11, в котором мы пишем у универе, переменные объявленые в заголовке цикла видимы и живут после цикла, тоесть равносильно: int i=1; for(; i<10; i++); (без фигурных скобок)
Re[2]: Как правильно? (синтаксис C++)
От: NikeByNike Россия  
Дата: 09.04.07 05:15
Оценка:
Здравствуйте, Fangorn, Вы писали:

F>равносильно: int i=1; for(; i<10; i++); (без фигурных скобок)


Кстати, есть стандартный способ решения таких проблем объявлением макроса:

#define for if (false) {} else for
Нужно разобрать угил.
Re[3]: Как правильно? (синтаксис C++)
От: alexst Россия  
Дата: 09.04.07 06:08
Оценка:
Здравствуйте, NikeByNike, Вы писали:

NBN>Здравствуйте, alexst, Вы писали:


A>>Если читать Б.Страустропа то там написано что в область вмдимости у переменной объявленной в цикле являться тело цикла . а такие глюки только в продуктах Micro$oft


NBN>Не надо гнать на 6 вижалку, это же раритет, долгожитель.

Я не гоню на VS вы сами гонете и спрашиваете почему в этой версии синтаксис такой в этой такой и я незнаю в каком синтаксе писать а давай закроем типа через #ifdef VC5 . . . #endif #ifdef VC6 . . . #endif #ifdef самая крутая VC . . . #endif #ifdef И самая любимая версия моего team leader . . . #endif ( если писать не дома )
Re: Как правильно? (синтаксис C++)
От: ilnar Россия  
Дата: 09.04.07 06:54
Оценка:
Здравствуйте, Dimitron, Вы писали:

D>Глюк VS2005 заключается в том что если поставить точку останова на int i=45; , и сделать шаг на while(1); то в окне watch, i по прежнему будет равно 10, вместо положенных 45, в то же время окно locals будет показывать 45. Как так может быть что у одной и той же переменной 2 разных значения в один момент времени?


Глюк отображения состоит вот в чем: в окне АУТО показываются автоматически переменные, в зависимости от области видимости, что есть корректно. А в ВАТЧ показывается еперменная, которую ты туда притащил за ухо или вписал находясь в области видимости ФОР — скорее у них есть отличие в двух переменных по внутренней идентификации, тогда некорректность в том что они не убирают из показа, видя что переменная покончила свою жизнь.
В общем, можешь смело рапортовать о баге в майкрасофт!
Re: Как правильно? (синтаксис C++)
От: sc Россия  
Дата: 09.04.07 07:28
Оценка:
Здравствуйте, Dimitron, Вы писали:

<skipped>
По стандарту правильно, разобрались. Но не все компиляторы знают о стандарте, это надо помнить. И писать так не рекомендуется, так как не красиво
Re[2]: Как правильно? (синтаксис C++)
От: Dimitron Россия  
Дата: 09.04.07 10:45
Оценка:
Здравствуйте, 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?
Re[3]: Как правильно? (синтаксис C++)
От: ilnar Россия  
Дата: 09.04.07 10:57
Оценка:
Здравствуйте, 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?
Re[4]: Как правильно? (синтаксис C++)
От: SWW Россия  
Дата: 09.04.07 12:54
Оценка:
Здравствуйте, ilnar, Вы писали:

I>кстати, у меня во вкладке ЛОКАЛ показывает 2 перемнных И (10 и 45)


А у меня &mdash; пять!
Автор: SWW
Дата: 04.04.05
Re[3]: Как правильно? (синтаксис C++)
От: Roman Odaisky Украина  
Дата: 09.04.07 13:25
Оценка:
Здравствуйте, NikeByNike, Вы писали:

F>>равносильно: int i=1; for(; i<10; i++); (без фигурных скобок)


NBN>Кстати, есть стандартный способ решения таких проблем объявлением макроса:


NBN>
#define for if (false) {} else for


Способ хороший, но не очень-то стандартный: если ты определяешь макросы, лексически идентичные ключевым словам, и если включаешь хотя бы один стандартный заголовочный файл, то формально имеешь UB.
До последнего не верил в пирамиду Лебедева.
Re[2]: Как правильно? (синтаксис C++)
От: Roman Odaisky Украина  
Дата: 09.04.07 13:26
Оценка:
Здравствуйте, sc, Вы писали:

sc>И писать так не рекомендуется, так как не красиво


Как «так»?
До последнего не верил в пирамиду Лебедева.
Re[4]: Как правильно? (синтаксис C++)
От: vsb Казахстан  
Дата: 09.04.07 15:18
Оценка:
Здравствуйте, Roman Odaisky, Вы писали:

RO>Способ хороший, но не очень-то стандартный: если ты определяешь макросы, лексически идентичные ключевым словам, и если включаешь хотя бы один стандартный заголовочный файл, то формально имеешь UB.


Даже если стандартные заголовчные файлы включаются перед всем остальным?
Re[5]: Как правильно? (синтаксис C++)
От: Roman Odaisky Украина  
Дата: 09.04.07 17:23
Оценка:
Здравствуйте, 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) могут возникнуть какие бы то ни было проблемы.
До последнего не верил в пирамиду Лебедева.
Re[3]: Как правильно? (синтаксис C++)
От: sc Россия  
Дата: 10.04.07 07:54
Оценка:
Здравствуйте, 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
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.