А>>И что будет в итоге?
A>использование переменной до ее инициализации будет, A>правда тут MSVC ничего не говорит.
Можно объяснить, где Вы увидели здесь использование переменной до ее инициализации? Мне ни VS 2008, ни VS 2010 ничего такого не выдают. А вот если убрать последнее =0, то действительно получаю варнинг
warning C4700: uninitialized local variable 'ii' used
Вообщем, большая просьба просветить.
Re: ??? Что это у МС-овского компилятора? - "int i=i=i=i=0;"
Здравствуйте, XJess, Вы писали:
XJ>Можно объяснить, где Вы увидели здесь использование переменной до ее инициализации? Мне ни VS 2008, ни VS 2010 ничего такого не выдают. А вот если убрать последнее =0, то действительно получаю варнинг
Не знаю, что это по стандарту, но gcc пишет
warning: operation on 'ii' may be undefined
Re[2]: ??? Что это у МС-овского компилятора? - "int i=i=i=i=
Здравствуйте, uzhas, Вы писали:
U>будет ii = 0;
попробую поправиться
присваивание право-ассоциативное, то есть исходное выражение эквивалентно следующему:
int ii = (ii = (ii = (ii = 0)));
однако скобки никак не влияют на sequence points. мы имеем между двумя точками следования двойную модификацию одной и той же переменной. следовательно, UB (с поправкой на багу в стандарте 2003 об unspecified behavior, недавно на форуме обсуждали)
еще можно попробовать определить сами точки следования: первая после входа в функцию main (но я не уверен в этом), вторая в конце нашего выражения (после ";")
Re[3]: ??? Что это у МС-овского компилятора? - "int i=i=i=i=
XJ>Можно объяснить, где Вы увидели здесь использование переменной до ее инициализации? Мне ни VS 2008, ни VS 2010 ничего такого не выдают. А вот если убрать последнее =0, то действительно получаю варнинг
XJ>warning C4700: uninitialized local variable 'ii' used
XJ>Вообщем, большая просьба просветить.
формально (по стандартам C99 и C++98) оператор присваивания возвращает присвоенное значение и, в качестве "побочного эффекта", записывает это значение в lvalue слева от знака присваивания. так вот, по тому же стандарту, порядок побочных эффектов между точками следования не определён. что формально должен делать этот код? записать 4 раза значение 0 в переменную ii. так вот, порядок, в котором значение 0 будет записываться, не определён . в этом смысле следует понимать предупреждение, которое выдаёт gcc на эту строчку (operation on 'ii' may be undefined).
естественно, если убрать "=0", само себе будет присваиваться неопределённое значение, на что уже начинает ругаться и msvc.
Re[4]: ??? Что это у МС-овского компилятора? - "int i=i=i=i=
Здравствуйте, const_volatile, Вы писали:
_>Здравствуйте, XJess, Вы писали:
А>>>>
А>>>>int ii=ii=ii=ii=0;
А>>>>
XJ>>Можно объяснить, где Вы увидели здесь использование переменной до ее инициализации? Мне ни VS 2008, ни VS 2010 ничего такого не выдают. А вот если убрать последнее =0, то действительно получаю варнинг
XJ>>warning C4700: uninitialized local variable 'ii' used
XJ>>Вообщем, большая просьба просветить.
_>формально (по стандартам C99 и C++98) оператор присваивания возвращает присвоенное значение и, в качестве "побочного эффекта", записывает это значение в lvalue слева от знака присваивания. так вот, по тому же стандарту, порядок побочных эффектов между точками следования не определён. что формально должен делать этот код? записать 4 раза значение 0 в переменную ii. так вот, порядок, в котором значение 0 будет записываться, не определён . в этом смысле следует понимать предупреждение, которое выдаёт gcc на эту строчку (operation on 'ii' may be undefined).
_>естественно, если убрать "=0", само себе будет присваиваться неопределённое значение, на что уже начинает ругаться и msvc.
int main()
{
int ii=ii=ii=ii=0;
}
ну тут походе на то что нет зависимости от побочных
эффектов так и так 0 будет а вот тут например
int main()
{
int ii=2;
ii+=ii+=ii+=ii+=1;
}
тут есть зависмость от побочных эффектов очень сомнительно
после ii+=1 результат 3 и его можно присвоить или еще не прочувствовавшему
побочный эффект ii со значением 2 и тогда результат будет 5
или с уже свершившимся побочным эффектом в ii тогда
результат будет 6 и так далее с остальными..
и вот еще есть ли гарантия на такое
int i = 5, j = i; ?
тут запятая не играет обычной роли оператора последовательности
есть ли тогда гарантия что побочные эффекты свершатся над i к моменту
выполнения j = i ?
Re[5]: ??? Что это у МС-овского компилятора? - "int i=i=i=i=
пытался сбить такой код на разных уровнях оптимизации
хотел подтвердить теорию что может неправильно посчитать
не оправдал надежд все правильно считает
int main()
{
int ii=printf("hj");
ii+=ii+=ii+=ii+=printf("j");
printf("%d\n", ii);
}
Здравствуйте, jyuyjiyuijyu, Вы писали:
J>тут есть зависмость от побочных эффектов очень сомнительно J>после ii+=1 результат 3 и его можно присвоить или еще не прочувствовавшему J>побочный эффект ii со значением 2 и тогда результат будет 5 J>или с уже свершившимся побочным эффектом в ii тогда J>результат будет 6 и так далее с остальными.. J>и вот еще есть ли гарантия на такое J>
J>int i = 5, j = i; ?
J>
J>тут запятая не играет обычной роли оператора последовательности J>есть ли тогда гарантия что побочные эффекты свершатся над i к моменту J>выполнения j = i ?
прости, я честно пытался понять смысл твоего сообщения, но так и не смог. я вижу у тебя знаки вопроса, то есть вроде бы ты что-то спрашиваешь, я вижу слова вроде бы с русскими буквами, но всё вместе как-то не складывается в осмысленные предложения. извини, наверное я тупой, но мне английский язык стандарта c++ легче было понять, чем разбираться в том что ты неписал.