c++ - 括号可以覆盖表达式的求值顺序吗?

标签 c++ expression operator-precedence associativity

<分区>

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

分组

对于具有多个运算符的表达式,操作数如何与特定运算符分组由优先级结合性决定 运算符,并且可能取决于求值顺序

订单

在 C++ 中,只有 4 个运算符具有指定的求值顺序(逻辑与、逻辑或、条件运算符和逗号运算符)。对于其他运算符,评估顺序未指定。

括号

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

然而,book Peter Gottschling 声称括号可以改变评估的顺序。我个人对此表示怀疑;我认为这是一个错误!在下面引用的示例中,括号没有说明 xyz 中的哪个表达式先求值,哪个在后求值哪一个是最后一个。它仅将表达式 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

问题

括号可以覆盖表达式的求值顺序吗?

最佳答案

引用的句子措辞不佳。作者并不是要改变或指定评估顺序;我认为“顺序”这个词的意思是人类如何阅读表达式(即优先级)。

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

关于c++ - 括号可以覆盖表达式的求值顺序吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48908803/

相关文章:

c - 如何解释运算符的结合性?

c - 何时在 c 中计算表达式中括号内的赋值运算符?

c++ - 如何比较和存储 2 个 vector 位置的数据元素?

c++ - 使用元编程计算非默认模板参数?

c# - 数据表选择 : Expression with a space problem

c# - 表达式树 GetString 结果

c++ - Pstreams - 如何写入标准输入并获取输出?

c++ - 如何使用 C++ 解析 HTTP 响应

wpf - 如何在 Adob​​e Illustrator 或 Expression Design 文件中嵌入 png 以创建 XAML

c - 输出 a = ~a + 2 << 1 ;