C ++二进制运算符的优先顺序

时间:2020-03-06 14:31:54  来源:igfitidea点击:

按照什么顺序测试以下参数(在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)