Порядок оценки подвыражений

Если порядок вычисления подвыражений не гарантируется, то почему это правильно?

int a = 1;
a = a + 1;

Здесь компилятор может сначала оценить a, а затем a + 1, поэтому a может быть 1 или 2, а это не так:

a = a++;

Здесь компилятор может сначала оценить a, а затем a++, где a может быть 1 или 2.

Какая разница?


person xdevel2000    schedule 04.06.2014    source источник


Ответы (2)


Это неопределенное поведение. Причина следующая:

Стандарт в §5/4 говорит

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

и

Доступ к предшествующему значению должен осуществляться только для определения сохраняемого значения.

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

person Abhineet    schedule 04.06.2014

Прочитайте о точках последовательности здесь, в основном у вас есть 2 назначения между двумя точками последовательности, и это будет вызвать неопределенное поведение.

a++ увеличит значение для a, а затем назначит его a, а другое назначение будет выполнено оператором =, в то время как a + 1 не изменит значение для a, и у вас будет только 1 назначение между двумя точками последовательности.

person LZR    schedule 04.06.2014