混淆运算符优先级:a<< b + c<< d

时间:2013-04-11 15:44:07

标签: c++ operator-precedence

运算符+的优先级高于C ++中的<<,这意味着表达式a << b + c << d应该被评估为:

a << (b + c) << d

没有意义。遵循

可以获得更多意义
a << (b + (c << d))

但这违反了+超过<<的优先权,不是吗?编译器如何评估“确实有意义”的部分?

UPDATE:在提出问题时,我认为编译器使用了第二个变体,这就是为什么我想知道编译器是如何进行此评估的。事实上,第一个被使用,它是正确的。

4 个答案:

答案 0 :(得分:6)

&#34;有意义&#34;是主观的。这就是为什么编译器不评估&#34; sense&#34;,而是基于一组规则的语法。因为<<具有更高的优先级(由这些规则集给出),它将表达式计算为

 a << (b + c) << d

如有疑问,请使用括号。

答案 1 :(得分:2)

编译器不会对有意义的内容进行任何说明。他们只是遵循规则。

制定规则的语言的设计者通常会尝试制定这些规则,以便他们有意义。当然,对一个人来说似乎是明智的,对另一个人来说显得很奇怪。真的没办法解决这个问题。

答案 2 :(得分:1)

operator <<的优先级低于operator +。请参阅wikipedia

编译器不会尝试理解是否有意义。他们只是遵循语法规则。要真正地知道为什么左移比优先级低,你应该问丹尼斯里奇的鬼。

除此之外,如果一个语法想要给出你想要的优先权,它应该向左移动并加上相同的优先级(以及从左到右的关联性)。

但是,如果你想到这样一个用例:

unsigned int a, b, mid;
...
mid = a + b >> 1;

然后首先计算a + b是完全有意义的。所以我认为最初在设计C时,他们认为移位是在常见的数学运算之后。


在C ++中,这甚至让事情变得更加舒适。现在的样子,你可以写:

cout << a + b << endl;

不需要括号。虽然这只是一个幸福的巧合,并且不会有这些优先权的原始原因。

答案 3 :(得分:0)

在这种情况下,编译器寻找最高优先级运算符并计算相应的操作。它命中+和总和b&amp; C。然后保持两个&lt;&lt;运算符和编译器按顺序处理它们