Я пытаюсь понять две ситуации в C.
Ситуация - 1:
int main() {
int x = -5, y = 8, z = 2;
z = y - (y = x);
printf("%d", z);
return 0;
}
Он печатает 0.
Ситуация - 2:
int main() {
int x = -5, y = 8, z = 2;
x = x + y - (y = x);
printf("%d", x);
return 0;
}
Печатает 8.
Почему в ситуации - 1 после (y = x) значение внутри y обновляется до -5, а затем используется во внешнем выражении, а в ситуации - 2, даже после (y = x) значение внешнего выражения y все еще равно 8?
Не делайте таких вещей, авторы языка программирования C прямо предостерегают от подобных вещей в своей книге.





Порядок вычисления операндов в C не указан. Таким образом, такие выражения, как z = y - (y = x), вызывают неопределенное поведение.
Если я скомпилирую ваш первый пример, gcc предупредит меня об этом.
% gcc test.c
test.c:5:16: warning: unsequenced modification and access to 'y' [-Wunsequenced]
z = y - (y = x);
~ ^
1 warning generated.
И вывод, когда я запускаю эту программу, равен 13.
Итак, будет ли это давать разные значения в разных компиляторах?
Или даже между компиляциями одного и того же источника одним и тем же компилятором. Стандарт не определяет поведение, поэтому не следует рассчитывать ни на какое поведение.
Суть в том, чтобы никогда не пытаться предвидеть, каким будет неопределенное поведение, потому что вы не можете этого сделать. Вместо этого старайтесь избегать его в первую очередь.
@RajIshu «поведение, определяемое реализацией» = различное поведение на разных компиляторах, но детерминированное и задокументированное поведение. «неопределенное поведение» = может случиться что угодно, включая сбои и т. д., и поведение недетерминировано, недокументировано, никаких гарантий нет. Это здесь неопределенное поведение.
Совет ре. сложные выражения - только не надо :)