4

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

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

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

编辑:接受的答案和跟进

这个链接有更多信息,但它的含义并不完全清楚。看来|| 和 && 具有相同的优先级,在这种情况下,它们是从左到右计算的。

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

4

5 回答 5

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 标准并且它与第一个站点一致,我'我要修改维基百科的文章。

于 2008-09-22T09:45:20.413 回答
4

这里

a || (b && c)

这是默认优先级。

于 2008-09-22T09:38:12.117 回答
2

&& (boolean AND) 的优先级高于 || (布尔或)。因此以下是相同的:

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

一个好的助记规则是记住 AND 就像乘法,OR 就像加法。如果我们将 AND 替换为 * 并将 OR 替换为 +,我们会得到一个更熟悉的等价物:

a + b * c
a + (b * c)

实际上,在布尔逻辑中,AND 和 OR 的行为类似于以下算术运算符:

aba AND ba * ba OR ba + 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,但我们假装是 1)
于 2008-09-22T10:39:29.550 回答
0

回答后续问题:显然 MSDN 上的表格是拙劣的,可能是有人无法制作像样的 HTML 表格(或使用 Microsoft 工具生成它!)。
我想它应该看起来更像 Rodrigo 引用的 Wikipedia 表格,其中我们有明确的小节。
但显然公认的答案是正确的,不知何故,我们与 && 和 || 具有相同的优先级 例如,与 * 和 + 相比。
您给出的片段对我来说是清晰明确的,但我想添加括号也不会造成伤害。

于 2008-09-22T10:34:27.080 回答
-2

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

只需创建一个小程序,其中包含以下语句的真值: (true || false && true)

如果结果为真,则 || 优先级高于&&,如果是falase,则反之。

于 2008-09-22T09:39:12.300 回答