Здравствуйте DarkGray, Вы писали:
DG>Здравствуйте Silver_s, Вы писали:
SS>>post decrement/increment должен выполняться после вычисления значения выражения, но что нужно понимать под выражением?
SS>>Или стандартом не оговорено когда надо делать пост операции?
DG>Вот здесь был большой разговор на эту тему:
DG>http://www.rsdn.ru/forum/message.asp?mid=48027Автор: Vi2
Дата: 23.04.02
Тут сразу несколько граблей раскидано.
1) undefined behavior (неопределенное поведение) при неоднократном использовании автоинкремента в выражении
2) правила вычисления оператора &&
3) не инициализированные переменные (j1, j2) (сработает вместе с оператором && )
Наконец, с учетом компиляции в режиме debug (без оптимизаций), мы получили весьма ожидаемый результат.
Вот что родил компилятор
[c]
i_1 = i; // i_1 = 0
i_2 = i; // i_2 = 0 (
повезло, что постинкремент выполняется позже)
j1 = i_1 + i_2; // j1 = 0
ok_1 = j1 != 13; // ok_1 = true
i++; i++; // i = 2 (а вот и автоинкремент)
if(!ok_1) goto false_branch;
i_3 = i; // i_3 = 2
i_4 = i; // i_4 = 2
j2 = i_3 + i_4; // j2 = 4
ok_2 = j2 != 13; // ok_2 = true
if(!ok_2) goto false_branch;
true_branch:;
// true
....
goto end_if;
false_branch:;
// false
....
end_if:;
[/code]
При оптимизации — возможны
любые, в том числе самые ужасные, результаты.