Почему поведение a = i + i ++ не определено и не определено

Я прочитал несколько очень хороших ответов о неопределенном поведении и точках последовательности (например,Неопределенные точки поведения и последовательности) и я понимаю, что

   int i = 1;
   a = i + i++; //this is undefined behaviour

является неопределенным кодом, в соответствии со стандартом C ++. Но какова более глубокая причина этого неопределенного поведения? Разве этого не достаточно, чтобы привести к неопределенному поведению? Обычный аргумент состоит в том, что, имея несколько точек последовательности, компиляторы C ++ могут лучше оптимизировать работу для разных архитектур, но не оставит ли это неопределенное значение и для этих оптимизаций? В

   a = foo(bar(1), bar(2)); //this is unspecified behaviour

компилятор также может оптимизировать, и это не неопределенное поведение. В первом примере кажется очевидным, что a равно 2 или 3, поэтому семантика мне кажется ясной. Я надеюсь, что есть причина, почему некоторые вещи не определены, а другие не определены.

Ответы на вопрос(5)

Ваш ответ на вопрос