Другие языки программирования и технологии

Ненужное присваивание в условии. С++

Всем не хворать.
Записал ненужное присваивание (ради интереса). Но тут нашлась проблема, которая меня заинтересовала.
Приоритет операции условия > приоритета присваивания.

Почему тогда строка
А) for (int x = 1; x = (x<1e2)?++x:0; printf ("%d\n", x));//префиксное увеличение
Не равносильна строке
for (int x = 1; x = (x<1e2)?x++:0; printf ("%d\n", x));//постфиксное

Ведь в первом случае цикл работает до тех пор, пока x<100. При этом, если условие true, x =++x. Приоритет префиксного увелич > приор. присваивания => x = x+1, затем это присваиваем иксу.
Во втором случае x = x++. Т.е. послеждовательность x = x; x++;
В C++ правила вычисления префисного и постфиксного инкрементов весьма сложны, и есть даже много случаев, когда порядок вычисления выражения с этими операциями не определен и даже может быть вообще не вычислением, а выдачей случайного числа (компилятор может вычислить выражение так или иначе, с разными результатами, как ему заблагорассудится, или вообще плюнуть на такое вычисление, простой пример ++i + ++i - такое выражение по правилам языка может давать ЛЮБОЙ результат не только из возможных вариантов логики выполнения) . Хотя реальные компиляторы используют тут все же правила "неуточняемого вычисления", то есть дают более или менее разумные результаты, однако разные, в зависимости от конкретного компилятора или даже его версии. Но по стандарту языка в этом случае применяются правила о "неопределенного вычисления", то есть программа вправе выдать как результат вообще любое число.
Когда именно в выражении будет делаться автоинкремент переменной и каков будет его результат, гарантируется только для определенных последовательностей операций внутри выражения, ограниченных так называемыми точками следования. Подробнее можно посмотреть в Википедии в статье "Точка следования".
Но забавно, что по стандарту языка для автоинкремента не только не всегда определен момент его выполнения, он может выдавать в случаях "неопределенного вычисления" не только большее на единицу значение, но и вообще любое число.
О чем меньше всего заботились создатели C++, это о простоте языка ;)
Андрей Александрович
Андрей Александрович
56 928
Лучший ответ
При чем здесь операция условия, ты об инкременте же говоришь.
Нет, не эквивалентно. Выражение ++x полностью эквивалентно (x+=1) - x увеличился, вернулось x+1.
Выражение x=x++ наоборот, эквивалентно выражению (x): x++ вычислился, вернул x И увеличил x на 1; присваивание снова возвращает x старое значение, возвращенное инкрементом. Это можно представить как
t=x;x+=1;x=t;
это скорей не операции условия, а такой синтаксис в некоторых случаях это очень удобно