以下参数测试的顺序是什么(在C ++中)?

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

我刚刚在我们的应用程序中看到了这个代码,我讨厌它,我想添加一些括号来澄清顺序。但我不想添加括号,直到我知道我将它们添加到正确的位置。

编辑:已接受的答案&跟进

此链接有更多信息,但并不完全清楚它的含义。好像||和&&是相同的优先级,在这种情况下,它们从左到右进行评估。

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

有帮助吗?

解决方案

此处

a || (b && c)

这是默认优先级。

其他提示

[ http://www.cppreference.com/wiki/operator_precedence] (已找到通过谷歌搜索“C ++运算符优先级”)

该页面告诉我们,第13组中的&&amp ;;优先级高于||在第14组中,表达式相当于|| (b&& c)。

不幸的是,维基百科文章[ http://en.wikipedia.org / wiki / Operators_in_C_and_C%2B%2B#Operator_precedence] 不同意这一点,但由于我的桌面上有C89标准并且它同意第一个网站,我将修改维基百科文章。

&安培;&安培; (布尔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)

回答后续问题:显然,MSDN上的表格很糟糕,可能是某些人无法做一个像样的HTML表格(或使用Microsoft工具来生成它!)。
我想它应该看起来更像Rodrigo引用的Wikipedia表,我们有明确的子部分。
但很明显,接受的答案是正确的,不知何故,我们与&&和||而不是用*和+,例如。
你给的片段对我来说清晰明确,但我想加括号也不会伤害。

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

只需创建一个带有语句的小程序,该语句打印出以下内容的真值: (true || false&& true)

如果结果为真,那么||优先级高于&&,如果是falase,那就相反了。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top