Code: Select all
#include<stdio.h>
int main()
{
int x = 5;
int z = x-- * x--;
printf("x = %d", x);
printf(" z = %d", z);
return 0;
}
х = 3 понимаю, z = 20 нет.
Code: Select all
#include<stdio.h>
int main()
{
int x = 5;
int z = x-- * x--;
printf("x = %d", x);
printf(" z = %d", z);
return 0;
}
Да, я это и ожидал (z = 25). Теперь понятно, что так не надо писать. Нашел два правила на эту тему. Согласны с ними?
Согласен, если в первом пункте заменить can't на shouldn't. То есть, это пока явной ошибкой не является, пока что только на warning тянет. Хотя я бы стандарт поправил, чтоб такое вообще не компилировалось.thinker wrote: ↑22 Jun 2018 17:46Да, я это и ожидал (z = 25). Теперь понятно, что так не надо писать. Нашел два правила на эту тему. Согласны с ними?
1) You can't apply the pre increment or the post increment more than once with an appearance of a variable.
2) Don’t use a variable that has a side effect applied to it more than once in a given statement. If applied more than once, the result may be undefined.
Первоначально я попробовал с этим online компилятором:
Вобщем теперь буду с ним всё проверять. Спасибо всем кто ответил.Warning[Pa079]: undefined behavior: variable "x" (declared at line 5) (or a value reached by some form of indirection through it) is modified more than once without an intervening sequence point in this statement main.c"
Поведение не определено. Никакого осмысленного результата тут нет и быть не может. Утверждать, что результат якобы "зависит от компилятора" - профанация. "Поведение не определено" означает, что оно может меняться непредсказуемо и в рамках одного компилятора.
А вот тут уже вылазит разница между С и С++. В С - поведение не определено. В С++, начиная с С++17, поведение определено однозначно: 'x' не меняется.
У меня C и компилятор на это, x = x--; тоже ругается и не выдает результат.
Ну так именно С и может/должен ругаться - в С поведение не определено. Вполне может быть, что ваш С компилятор в этом случае гарантирует, что 'x' не меняется, т.е. ведет себя предсказуемо, но с точки зрения языка С это не более чем одно из возможных проявлений неопределенного поведения.