答案 0 :(得分:40)
答案 1 :(得分:12)
优先影响评价顺序的唯一方法就是它 创造依赖;否则两者是正交的。你'已经 精心选择的简单例子,其中创建了依赖关系 优先级最终会完全定义评估顺序,但这不是 一般都是。并且不要忘记许多表达方式 两种效果:它们产生一个值,它们有副作用。这些 两个不需要一起出现,所以即使是依赖 强制执行特定的评估顺序,这只是顺序 评估价值观;它对副作用没有影响。
答案 2 :(得分:7)
看待这个的好方法是使用表达式树。
如果你有一个表达式,让我们说x+y*z
你可以将它重写到表达式树中:
应用优先级和关联性规则:
x + ( y * z )
应用优先级和关联性规则后,您可以安全地忘记它们。
以树形式:
x
+
y
*
z
此表达式的叶子为x
,y
和z
。这意味着您可以按照您想要的任何顺序评估x
,y
和z
,这也意味着您可以评估*
和{{的结果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
会有未定义的结果。不是吗?