括号可以覆盖表达式的求值顺序吗?
Can parentheses override an expression's order of evaluation?
分组运算符和操作数和Order of Evaluation是C++中表达式的两个重要概念。
分组
对于具有多个运算符的表达式,操作数如何与特定运算符分组由优先级和决定运算符的结合性,并且可能取决于求值顺序。
订单
在 C++ 中,只有 4 个运算符具有指定的求值顺序(逻辑与、逻辑或、条件运算符和逗号运算符)。对于其他运算符,评估顺序未指定。
括号
括号可以覆盖优先级和结合性,因此指定复合表达式的分组。
然而,Peter Gottschling 的 book 声称括号可以改变计算的顺序。我个人对此表示怀疑;我认为这是一个错误!在下面引用的示例中,括号没有说明 x
、y
和 z
中哪个表达式先求值,哪个在后,哪个在最后。它仅将表达式 y + z
分组为 *
运算符的左操作数。
An expression surrounded by parentheses is an expression as well,
e.g., (x + y)
. As this grouping by parentheses precedes all operators,
we can change the order of evaluation to suit our needs: x * (y + z)
computes the addition first. Discovering Modern C++, Chapter 1.4.1
问题
括号可以覆盖表达式的求值顺序吗?
引用的句子措辞不当。作者并不是说 求值顺序 改变了,甚至没有指定;我认为 "order" 这个词的意思是人类如何阅读表达式(即优先级)。
当然,如果三个变量是独立的并且读取它们没有side-effects,"as if"规则使得未指定的顺序无关紧要,因为它不会改变表达式的值。
分组运算符和操作数和Order of Evaluation是C++中表达式的两个重要概念。
分组
对于具有多个运算符的表达式,操作数如何与特定运算符分组由优先级和决定运算符的结合性,并且可能取决于求值顺序。
订单
在 C++ 中,只有 4 个运算符具有指定的求值顺序(逻辑与、逻辑或、条件运算符和逗号运算符)。对于其他运算符,评估顺序未指定。
括号
括号可以覆盖优先级和结合性,因此指定复合表达式的分组。
然而,Peter Gottschling 的 book 声称括号可以改变计算的顺序。我个人对此表示怀疑;我认为这是一个错误!在下面引用的示例中,括号没有说明 x
、y
和 z
中哪个表达式先求值,哪个在后,哪个在最后。它仅将表达式 y + z
分组为 *
运算符的左操作数。
An expression surrounded by parentheses is an expression as well, e.g.,
(x + y)
. As this grouping by parentheses precedes all operators, we can change the order of evaluation to suit our needs:x * (y + z)
computes the addition first. Discovering Modern C++, Chapter 1.4.1
问题
括号可以覆盖表达式的求值顺序吗?
引用的句子措辞不当。作者并不是说 求值顺序 改变了,甚至没有指定;我认为 "order" 这个词的意思是人类如何阅读表达式(即优先级)。
当然,如果三个变量是独立的并且读取它们没有side-effects,"as if"规则使得未指定的顺序无关紧要,因为它不会改变表达式的值。