но и про associativity. Второе как раз про порядок evaluation
Нет, ассоциативность - это как расставлять скобки. Т.е. что
a + b + c это
(a + b) + c. При этом никаких гарантий, что
c вычислится раньше или позже суммы нет.
Почему бы не сделать инкремент полноценной операцией, предусматривающей обязательное сохранение увеличенного значения перед продолжением работы?
Потому что это мешает каким-то оптимизациям, или по крайней мере разработчики стандарта думали, что может помешать. Вообще как на современных процессорах на самом деле работает вся эта арифметика с модификациями - вопрос очень сложный, я деталей не знаю (возможно
Dmitriy40 что-то интересное может рассказать).
Интересно, а взятие инкремента в скобки - например, i = (++i) + (++i) - добавит определённости?
Нет, скобки влияют только на то, какое дерево получается.
(Оффтоп)
Странная тема получается: обсуждаем, что будет, если сделать разные варианты того, чего делать вообще не надо
Это часто происходит. Майерс какой-то мой вопрос (вроде что-то про вложенные std::bind) прокомментировал "Есть множество вещей, которые можно сделать в С++, и есть не совпадающее, но сильно пересекающееся с ним множество вещей, которые стоит делать в С++. А вопросы мне как правило задают про вещи, которые очень далеки от обоих этих множеств".
Вообще исторически C был близок к assembler.
В то время, когда С появлялся, процессоры были гораздо разнообразнее, чем сейчас, и куча неопределенного поведения идет как раз оттуда. Одна из причин успеха С - он позволил писать программы, одинаково работающие на всём этом зоопарке. В том числе и за счет запрета конструкций, которые на части этого зоопарка эффективно реализовать не получится.