Ассоциативность оператора и порядок оценки

Я читал здесь и там, из stackoverflow и других веб-сайтов, что оценка выражения зависит от приоритета оператора и ассоциативности операторов. Проблема в том, что я прочитал строку с одного известного веб-сайта: Приоритет и ассоциативность не зависят от порядка оценки. Хорошо, но я прочитал на образовательном сайте эту строку: Тип данных и значение выражения зависят от типов данных операндов и порядка оценки операторов, который определяется приоритетом и ассоциативностью операторов.

Ладно, я в замешательстве. Я знаю, что компилятор может оценивать операторы одного и того же приоритета в другом порядке в целях оптимизации, я думаю, поэтому поведение не определено, в каком порядке будет происходить оценка. Это означает, что он может изменить все выражение, и результат будет таким же, если нет никаких побочных эффектов или если есть только один побочный эффект. Или я ошибаюсь? Если я прав, то почему они определяют ассоциативность операторов, если порядок вычисления не определен в большинстве случаев, за исключением цепочки присваивания, логических операторов короткого замыкания и некоторых других случаев, я думаю.

Итак, вкратце: зависит ли порядок оценки от ассоциативности. Если это так, то можете ли вы объяснить, как? Если это не зависит от ассоциативности, то почему они определяют ассоциативность в первую очередь, это только для фазы синтаксического анализа, а не для фазы оценки? Единственное место, где я видел полезную ассоциативность, — это тернарный оператор. И почему ассоциативность не применяется для перегрузки оператора, например, для оператора ‹‹ в cout, где мы получаем поведение undefined, потому что порядок вычисления аргументов функции не определен?


person emilxp    schedule 05.02.2014    source источник
comment
Возьмем такое выражение, как a + b*c + d*e. Теперь представьте это как operator+(a, operator+(operator*(b,c),operator*(d,e))). Все аргументы каждого из них должны быть оценены, прежде чем можно будет сделать вызов, но порядок, в котором это происходит, не указан. Приоритет уже встроен в расширенное выражение.   -  person chris    schedule 06.02.2014
comment
Из изо рта лошади: 6,5/3 : группировка операторов и операндов указывается синтаксисом.85) За исключением случаев, указанных ниже, побочные эффекты и вычисления значений подвыражений не имеют последовательности.86)   -  person John Bode    schedule 06.02.2014
comment
Практический пример: вы не можете предсказать значение (INT_MAX/2)+(2/2), потому что компилятор может вычислить (INT_MAX+1)/2, что является переполнением. Да, что-то очень похожее произошло со мной.   -  person david.pfx    schedule 06.02.2014