Я читал здесь и там, из stackoverflow и других веб-сайтов, что оценка выражения зависит от приоритета оператора и ассоциативности операторов. Проблема в том, что я прочитал строку с одного известного веб-сайта: Приоритет и ассоциативность не зависят от порядка оценки. Хорошо, но я прочитал на образовательном сайте эту строку: Тип данных и значение выражения зависят от типов данных операндов и порядка оценки операторов, который определяется приоритетом и ассоциативностью операторов.
Ладно, я в замешательстве. Я знаю, что компилятор может оценивать операторы одного и того же приоритета в другом порядке в целях оптимизации, я думаю, поэтому поведение не определено, в каком порядке будет происходить оценка. Это означает, что он может изменить все выражение, и результат будет таким же, если нет никаких побочных эффектов или если есть только один побочный эффект. Или я ошибаюсь? Если я прав, то почему они определяют ассоциативность операторов, если порядок вычисления не определен в большинстве случаев, за исключением цепочки присваивания, логических операторов короткого замыкания и некоторых других случаев, я думаю.
Итак, вкратце: зависит ли порядок оценки от ассоциативности. Если это так, то можете ли вы объяснить, как? Если это не зависит от ассоциативности, то почему они определяют ассоциативность в первую очередь, это только для фазы синтаксического анализа, а не для фазы оценки? Единственное место, где я видел полезную ассоциативность, — это тернарный оператор. И почему ассоциативность не применяется для перегрузки оператора, например, для оператора ‹‹ в cout, где мы получаем поведение undefined, потому что порядок вычисления аргументов функции не определен?
a + b*c + d*e
. Теперь представьте это какoperator+(a, operator+(operator*(b,c),operator*(d,e)))
. Все аргументы каждого из них должны быть оценены, прежде чем можно будет сделать вызов, но порядок, в котором это происходит, не указан. Приоритет уже встроен в расширенное выражение. - person chris   schedule 06.02.2014