Было бы безопасно сделать обмен на "b = (a + b) - (a = b);"? - PullRequest
4 голосов
/ 25 февраля 2012

В Cprogramming.com Я нашел этот кусок кода:

int a,b;
scanf("%d %d",&a,&b);
b=(a+b)-(a=b);
printf("%d %d",a,b);

Это, как утверждается, совет / хитрость для "замены без использования временного".Мои тесты на Linux gcc доказывают это.Однако не будет ли порядок, насколько разные компиляторы или платформы, вычисляющие это выражение, имеют здесь значение?Безопасно ли использовать такой код?

Ответы [ 2 ]

12 голосов
/ 25 февраля 2012

Нет.В выражении (a+b)-(a=b) отсутствует точка последовательности между записью a и считыванием a в подвыражении (a+b) для определения значения, которое будет сохранено в b, поэтому поведение не определено.

8 голосов
/ 25 февраля 2012

Тем не менее, не будет ли порядок, как разные компиляторы или платформы, вычисляющие это выражение, имеет здесь значение?

Да.

Безопасно ли использовать такой код?

Нет, это неопределенное поведение.

...