C ++二进制运算符的优先顺序
按照什么顺序测试以下参数(在C ++中)?
if (a || b && c) { }
我刚刚在我们的应用程序中看到了此代码,但我讨厌它,我想添加一些方括号以阐明顺序。但是,在我知道将其添加到正确的位置之前,我不想添加这些支架。
编辑:接受的答案和跟进
该链接提供了更多信息,但尚不清楚其含义。似乎||和&&具有相同的优先级,在这种情况下,它们是从左到右求值的。
http://msdn.microsoft.com/en-us/library/126fe14k.aspx
解决方案
从这里:
a || (b && c)
这是默认优先级。
我不确定,但是我们应该很容易找到它。
只需创建一个带有以下语句的小程序,该语句将打印出以下内容的真实值:
(真||假&&真)
如果结果为true,则||具有比&&更高的优先级,如果是虚假的,则相反。
[http://www.cppreference.com/wiki/operator_precedence](通过对" C ++运算符优先级"进行谷歌搜索找到)
该页面告诉我们,第13组中的&&优先级高于||。在第14组中,因此该表达式等效于||。 (b && c)。
不幸的是,维基百科文章[http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B#Operator_precedence]对此表示不同意,但是由于我的办公桌上装有C89标准,并且与第一个站点相同,因此我将修改维基百科的文章。
要回答后续问题:很明显,MSDN的表已被破坏,可能是由于某人无法创建像样的HTML表(或者使用Microsoft工具生成了它!)。
我想它应该看起来更像Rodrigo引用的Wikipedia表,其中有清晰的小节。
但是显然,已接受的答案是正确的,因此我们在某种程度上与&&和||具有相同的优先级。例如使用*和+。
我们提供的代码段对我来说是明确且明确的,但是我想添加括号也不会造成伤害。
&&(布尔AND)的优先级高于||。 (布尔值OR)。因此,以下内容是相同的:
a || b && c a || (b && c)
一个好的记忆规则是记住AND就像乘法,而OR就像加法。如果我们用*替换AND并用+替换OR,我们会得到一个更熟悉的等价物:
a + b * c a + (b * c)
实际上,在布尔逻辑中,AND和OR的作用类似于以下算术运算符:
a b a AND b a * b a OR b a + b --------------------------------------- 0 0 0 0 0 0 0 1 0 0 1 1 1 0 0 0 1 1 1 1 1 1 1 1 (2 really, but we pretend it's 1)