2008-09-22 39 views
4

以什么顺序测试以下参数(使用C++)?C++二进制运算符优先顺序

if (a || b && c) 
{ 
} 

我刚看到在我们的应用程序的代码,我恨它,我想添加一些括号只是澄清排序。但我不想添加括号,直到我知道我将它们添加到正确的位置。

编辑:接受的答案&跟进

该链接有更多的信息,但它不是完全清楚这意味着什么。看来||和& &是相同的优先级,在这种情况下,它们从左到右进行评估。

http://msdn.microsoft.com/en-us/library/126fe14k.aspx

回答

4

here

a || (b && c) 

这是默认的优先级。

+1

C++的优先级不可定制,因此“默认”是多余的。 – 2008-09-22 09:42:55

+0

我的意思是“默认”,如“非括号内” – tzot 2008-09-22 09:49:46

-2

我不确定,但应该很容易找到答案。

只需创建一个小程序与打印出的真值的语句: (真||假& &真)

如果结果为真,那么||具有比& &更高的优先级,如果它是falase,则是相反的。

7

[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标准,并且与第一个网站一致,因此我将修改维基百科文章。

0

回答后续问题:显然,MSDN中的表已经过时了,也许有人无法做出正确的HTML表(或使用Microsoft工具生成它!)。
我想它应该看起来更像罗德里格引用的维基百科表,我们有明确的小节。
但很明显,接受的答案是正确的,不知何故,我们与& &和||比如使用*和+。
你给的代码片段对我来说是清晰明确的,但是我想添加括号也不会伤害任何一个。

2

& &(布尔AND)具有比||更高的优先级。 (布尔OR)。因此,以下是相同的:

a || b && c 
a || (b && c) 

一个很好的记忆规则是要记住,犹如乘,或像加法。如果我们带*号和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)