??? Что это у МС-овского компилятора? - "int i=i=i=i=0;"
От: Аноним  
Дата: 11.05.11 14:32
Оценка:
int ii=ii=ii=ii=0;


И что будет в итоге?
Re: ??? Что это у МС-овского компилятора? - "int i=i=i=i=0;"
От: Abyx Россия  
Дата: 11.05.11 14:39
Оценка:
Здравствуйте, Аноним, Вы писали:


А>
А>int ii=ii=ii=ii=0;
А>


А>И что будет в итоге?


использование переменной до ее инициализации будет,
правда тут MSVC ничего не говорит.
In Zen We Trust
Re[2]: ??? Что это у МС-овского компилятора? - "int i=i=i=i=
От: XJess  
Дата: 11.05.11 16:05
Оценка:
Здравствуйте, Abyx, Вы писали:

А>>
А>>int ii=ii=ii=ii=0;
А>>


А>>И что будет в итоге?


A>использование переменной до ее инициализации будет,

A>правда тут MSVC ничего не говорит.

Можно объяснить, где Вы увидели здесь использование переменной до ее инициализации? Мне ни VS 2008, ни VS 2010 ничего такого не выдают. А вот если убрать последнее =0, то действительно получаю варнинг

warning C4700: uninitialized local variable 'ii' used

Вообщем, большая просьба просветить.
Re: ??? Что это у МС-овского компилятора? - "int i=i=i=i=0;"
От: uzhas Ниоткуда  
Дата: 11.05.11 16:16
Оценка: -1
Здравствуйте, Аноним, Вы писали:

А>И что будет в итоге?

будет ii = 0;
Re[3]: ??? Что это у МС-овского компилятора? - "int i=i=i=i=
От: Sir-G  
Дата: 11.05.11 17:35
Оценка:
Здравствуйте, XJess, Вы писали:

XJ>Можно объяснить, где Вы увидели здесь использование переменной до ее инициализации? Мне ни VS 2008, ни VS 2010 ничего такого не выдают. А вот если убрать последнее =0, то действительно получаю варнинг


Не знаю, что это по стандарту, но gcc пишет
warning: operation on 'ii' may be undefined
Re[2]: ??? Что это у МС-овского компилятора? - "int i=i=i=i=
От: uzhas Ниоткуда  
Дата: 11.05.11 21:18
Оценка:
Здравствуйте, uzhas, Вы писали:

U>будет ii = 0;

попробую поправиться
присваивание право-ассоциативное, то есть исходное выражение эквивалентно следующему:
int ii = (ii = (ii = (ii = 0)));

однако скобки никак не влияют на sequence points. мы имеем между двумя точками следования двойную модификацию одной и той же переменной. следовательно, UB (с поправкой на багу в стандарте 2003 об unspecified behavior, недавно на форуме обсуждали)
еще можно попробовать определить сами точки следования: первая после входа в функцию main (но я не уверен в этом), вторая в конце нашего выражения (после ";")
Re[3]: ??? Что это у МС-овского компилятора? - "int i=i=i=i=
От: const_volatile  
Дата: 11.05.11 21:35
Оценка: 2 (1)
Здравствуйте, 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.
Re[4]: ??? Что это у МС-овского компилятора? - "int i=i=i=i=
От: jyuyjiyuijyu  
Дата: 12.05.11 09:25
Оценка:
Здравствуйте, 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=
От: jyuyjiyuijyu  
Дата: 12.05.11 10:13
Оценка:
пытался сбить такой код на разных уровнях оптимизации
хотел подтвердить теорию что может неправильно посчитать
не оправдал надежд все правильно считает
int main()
{
    int ii=printf("hj");
    ii+=ii+=ii+=ii+=printf("j");
    printf("%d\n", ii);
}

всегда выводит 24
///////////O1-Os////////////////////////////
int main()
{
00401000 56               push        esi  
    int ii=printf("hj");
00401001 8B 35 A0 20 40 00 mov         esi,dword ptr [__imp__printf (4020A0h)] 
00401007 57               push        edi  
00401008 68 F4 20 40 00   push        offset string "hj" (4020F4h) 
0040100D FF D6            call        esi  
0040100F 8B F8            mov         edi,eax 
    ii+=ii+=ii+=ii+=printf("j");
00401011 C7 04 24 F8 20 40 00 mov         dword ptr [esp],offset string "j" (4020F8h) 
00401018 FF D6            call        esi  
0040101A 03 C7            add         eax,edi 
0040101C C1 E0 03         shl         eax,3 
    printf("%d\n", ii);
0040101F 50               push        eax  
00401020 68 FC 20 40 00   push        offset string "%d\n" (4020FCh) 
00401025 FF D6            call        esi  
00401027 83 C4 0C         add         esp,0Ch 
0040102A 5F               pop         edi  
}

///////////O2-Ot////////////////////////////
int main()
{
00401000 56               push        esi  
    int ii=printf("hj");
00401001 8B 35 A0 20 40 00 mov         esi,dword ptr [__imp__printf (4020A0h)] 
00401007 57               push        edi  
00401008 68 F4 20 40 00   push        offset string "hj" (4020F4h) 
0040100D FF D6            call        esi  
    ii+=ii+=ii+=ii+=printf("j");
0040100F 68 F8 20 40 00   push        offset string "j" (4020F8h) 
00401014 8B F8            mov         edi,eax 
00401016 FF D6            call        esi  
00401018 03 C7            add         eax,edi 
0040101A 03 C0            add         eax,eax 
0040101C 03 C0            add         eax,eax 
0040101E 03 C0            add         eax,eax 
    printf("%d\n", ii);
00401020 50               push        eax  
00401021 68 FC 20 40 00   push        offset string "%d\n" (4020FCh) 
00401026 FF D6            call        esi  
00401028 83 C4 10         add         esp,10h 
0040102B 5F               pop         edi  
}
0040102C 33 C0            xor         eax,eax 
0040102E 5E               pop         esi  
0040102F C3               ret

может на GCC кто нибудь проверит ?
с оптимизацией
Re[5]: ??? Что это у МС-овского компилятора? - "int i=i=i=i=
От: const_volatile  
Дата: 12.05.11 20:50
Оценка: +2
Здравствуйте, 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++ легче было понять, чем разбираться в том что ты неписал.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.