2011-01-24 2 views
0

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

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

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

Результат:

i= 13 

ответ

7

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

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

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

-3

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

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

+0

+1 намного лучшее описание, чем у меня :) – badgerr

+1

Это, безусловно, неопределенное поведение и не имеет ничего общего со стеками. –

+1

AFAIK, если какое-то выражение меняет некоторую переменную более одного раза, это UB. Если x не указывает на i, это будет другая история. Может быть. –

 Смежные вопросы

  • Нет связанных вопросов^_^