+ = Операторская цепочка (с тире UB) - PullRequest
0 голосов
/ 24 января 2011

Я понимаю, что здесь нет точки последовательности перед точкой с запятой, но есть ли правдоподобное объяснение для разыменованного указателя использовать старое значение 2 в выражении?

Или это можно просто описать как неопределенное поведение?

int i=2;
int *x=&i;
*x+=*x+=i+=7;

Результат:

i= 13

Ответы [ 2 ]

7 голосов
/ 24 января 2011

Это "просто" неопределенное поведение.

Тем не менее, компилятор, вероятно, генерирует код, который читает значение i один раз, затем выполняет всю арифметику, а затем сохраняет новое значение i.

Очевидный способ узнать реальное объяснение состоит в том, чтобы взглянуть на сборку, сгенерированную компилятором.

0 голосов
/ 24 января 2011

Поведение не является неопределенным, оно зависит от того, как компилятор разбивает выражение и помещает промежуточные результаты в стек. Два *x s вычисляются первыми (оба равны 2) и помещаются в стек. Затем к i добавлено 7 и равно 9. Затем вторая *x, которая по-прежнему равна 2, снимается со стека и добавляется, чтобы получить 11. Затем первая *x снимается со стека и добавили к 11, чтобы сделать 13.

Посмотрите на обратную польскую запись для подсказок о том, что здесь происходит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...