括号可以覆盖表达式的评估顺序吗?

时间:2018-02-21 14:47:04

标签: c++ expression operator-precedence associativity

分组运算符和操作数以及评估的顺序是C ++中表达式的两个重要概念。

分组

对于具有多个运算符的表达式,与特定运算符分组的操作数如何由 优先级 关联性决定强大的运算符,可能取决于 评估顺序

顺序

在C ++中,只有4个运算符具有指定的计算顺序(逻辑AND,逻辑OR,条件和逗号运算符)。对于其他运营商,未指定评估订单。

括号

括号可以覆盖优先级和关联性,因此可以指定复合表达式的分组。

然而,Peter Gottschling的book声称括号可以改变评估的顺序。我个人对此表示怀疑;我认为这是一个错误!在下面的引文中的示例中,括号不会告诉您xyz的哪个表达式首先被评估,哪一个是稍后的,哪一个是最后一个。它只将表达式y + z分组为*运算符的左操作数。

  

括号括起来的表达式也是一个表达式,   例如,(x + y)。由于这个括号括号在所有运算符之前,   我们可以更改评估顺序以满足我们的需求:x * (y + z)   首先计算加法。 Discovering Modern C++, Chapter 1.4.1

问题

括号可以覆盖表达式'评估顺序?

1 个答案:

答案 0 :(得分:1)

引用的句子措辞不力。作者并不是说评估顺序被更改,甚至指定;我认为“秩序”这个词的意思是人类如何阅读表达(即优先权)。

当然,如果三个变量是独立的并且读取它们没有副作用,那么“似乎”规则会使未指定的顺序无关紧要,因为它不会改变表达式的值。