Это неопределенное поведение, чтобы изменить объект и использовать его в том же выражении, но подвыражения разделяются оператором запятой? - PullRequest
0 голосов
/ 02 марта 2019

Здравствуйте, я нашел эту программу на каком-то сайте.Что меня смущает, так это то, что эта программа изменяет один и тот же объект и использует его в том же выражении, таким образом, это неопределенное поведение?или это нормально, потому что оператор запятой , гарантирует оценку слева направо?

int x = 10, y;

// The following is equavalent to y = x++ 
y = (x++, printf("x = %d\n", x), ++x, printf("x = %d\n", x), x++);

// Note that last expression is evaluated 
// but side effect is not updated to y 
printf("y = %d\n", y);
printf("x = %d\n", x);

Выход:

x = 11
x = 12
y = 12
x = 13

1 Ответ

0 голосов
/ 02 марта 2019

Оператор запятой, гарантирует оценку слева направо?

Да, с оговоркой.С https://en.cppreference.com/w/cpp/language/operator_other#Built-in_comma_operator

В выражении запятой E1, E2 вычисляется выражение E1, его результат отбрасывается (хотя, если он имеет тип класса, он не будет уничтожен до концасодержащего полного выражения), и его побочные эффекты завершаются до того, как вычисление выражения E2 начинается

Предупреждение:

(обратите внимание, что пользовательскийоператор, не может гарантировать последовательность) (до C ++ 17).

Предупреждение не относится к вашему случаю, поскольку вы не используете какую-либо пользовательскую функцию оператора запятой.


Если вы не заняты стресс-тестированием компилятора, вы никогда не должны писать такой код.Используйте более простой, более понятный код.

x++;
printf("x = %d\n", x);

++x;
printf("x = %d\n", x);

x++;
y = x;
...