运算符优先级与评估顺序

时间:2011-03-29 13:16:24

标签: c++ c operator-precedence

6 个答案:

答案 0 :(得分:40)

答案 1 :(得分:12)

优先影响评价顺序的唯一方法就是它 创造依赖;否则两者是正交的。你'已经 精心选择的简单例子,其中创建了依赖关系 优先级最终会完全定义评估顺序,但这不是 一般都是。并且不要忘记许多表达方式 两种效果:它们产生一个值,它们有副作用。这些 两个不需要一起出现,所以即使是依赖 强制执行特定的评估顺序,这只是顺序 评估价值观;它对副作用没有影响。

答案 2 :(得分:7)

看待这个的好方法是使用表达式树。

如果你有一个表达式,让我们说x+y*z你可以将它重写到表达式树中:

应用优先级和关联性规则:

x + ( y * z )

应用优先级和关联性规则后,您可以安全地忘记它们。

以树形式:

  x
+
    y
  *
    z

此表达式的叶子为xyz。这意味着您可以按照您想要的任何顺序评估xyz,这也意味着您可以评估*和{{的结果1}}以任何顺序。

现在因为这些表达没有副作用,所以你并不在乎。但如果他们这样做,排序可以改变结果,因为排序可以是编译器决定的任何内容,所以你有一个问题。

现在,序列点为这种混乱带来了一些秩序。他们有效地将树切成了几个部分。

x

优先级和关联性

x + y * z, z = 10, x + y * z

树:

x + ( y * z ) , z = 10, x + ( y * z)

树的顶部将在中间之前评估,中间在底部之前评估。

答案 3 :(得分:4)

  

它提到“首先评估具有高优先级运算符的表达式。”

我将重复我所说的here。就标准C和C ++而言,文章存在缺陷。优先级仅影响哪些令牌被视为每个运算符的操作数,但它不会以任何方式影响评估顺序。

因此,该链接仅解释了Microsoft如何实现内容,而不是语言本身的工作方式。

答案 4 :(得分:2)

优先级与评估顺序无关,反之亦然。

Precedence规则描述了当表达式混合使用不同类型的运算符时,如何将表示不足的表达式括起来。例如,乘法的优先级高于加法,因此2 + 3 x 4等同于2 + (3 x 4),而不是(2 + 3) x 4

评估顺序规则描述了表达式中每个操作数的计算顺序。

举个例子

y = ++x || --y;   

按运算符优先级规则,它将为括号,因为(++/--的优先级高于优先级高于||的{​​{1}}:

=

逻辑OR y = ( (++x) || (--y) ) 的评估顺序表明(C11 6.5.14)

  

||运营商保证从左到右评估。

这意味着将首先评估左操作数,即子表达式||。由于短路行为; 如果第一个操作数与(x++)不相等,则不评估第二个操作数,虽然它是0之前的括号,但不会评估右操作数--y

答案 5 :(得分:-1)

我认为这只是

a++ + ++a

epxression有问题,因为

a = a++ + ++a;

首先在3.然后在6.规则中:在分配之前完成评估。

所以,

a++ + ++a

得到a = 1完全评估为:

1 + 3   // left to right, or
2 + 2   // right to left

结果相同= 4.

这是

a++ * ++a    // or
a++ == ++a

会有未定义的结果。不是吗?