运算符+
的优先级高于C ++中的<<
,这意味着表达式a << b + c << d
应该被评估为:
a << (b + c) << d
但没有意义。遵循
可以获得更多意义a << (b + (c << d))
但这违反了+
超过<<
的优先权,不是吗?编译器如何评估“确实有意义”的部分?
UPDATE:在提出问题时,我认为编译器使用了第二个变体,这就是为什么我想知道编译器是如何进行此评估的。事实上,第一个被使用,它是正确的。
答案 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;运算符和编译器按顺序处理它们