我从这里和那里、从 stackoverflow 和其他网站读到,表达式评估取决于运算符的优先级和运算符的关联性。问题是我从某个著名网站上读过这句话:优先级和关联性独立于评估顺序。好的,但是我在一个教育网站上读过这一行:表达式的数据类型和值取决于操作数的数据类型和运算符的求值顺序,这由运算符的优先级和关联性决定。
好吧,我很困惑。我知道编译器可以出于优化目的以不同的顺序评估具有相同优先级的运算符,我认为,因此行为未定义评估发生的顺序。这意味着它可以改变整个表达式,如果没有任何副作用,或者只有一个副作用,结果将是相同的。还是我错了?如果我是对的,那么如果大多数情况下评估顺序未定义,那么为什么他们定义运算符的关联性,除了在赋值链、逻辑短路运算符和我认为的其他一些情况下。
简而言之:评估顺序是否取决于关联性。如果是的话,你能解释一下吗?如果它不依赖于关联性,那么他们为什么首先定义关联性,它只是用于解析阶段,而不是用于评估阶段?我看到关联性有用的唯一地方是三元运算符。为什么关联性不适用于运算符重载,例如对于我们得到未定义行为的 cout 中的 operator<<,因为函数参数的评估顺序是未定义的?