我有一个简单的程序,具有1个AND和多个OR运算符,如下所示:
#include <iostream>
using namespace std;
int main()
{
bool a = true;
bool b = true;
bool c = true;
bool d = true;
if (!a && b || c || d)
cout << "run";
else
cout << "pass";
return 0;
}
我希望程序将输出pass
,因为我声明a为true。但是,如果您运行该程序,它将输出:run
如果我通过在
中添加方括号来更改if语句行if (!a && (b || c || d))
cout << "run";
else
cout << "pass";
它将给出预期的输出pass
。为什么这样工作?
答案 0 :(得分:8)
这是因为逻辑和运算符(&&
)比逻辑或运算符(||
和逻辑取反运算符(!
)具有更高的precedence在这三个中优先级最高。
这意味着表达式!a && b || c || d
被分组为((((!a) && b) || c) || d)
。由内而外地工作:
!a
是false
-> (((false && b) || c) || d)
false && b
是false
-> ((false || c) || d)
false || c
是true
-> (true || d)
true || d
是true
-> true
因此整个表达式的计算结果为true
。
答案 1 :(得分:4)
在C ++(以及大多数其他编程语言)中,&&
运算符的优先级比||
大。因此,您的第一个版本的代码实际上正在执行,就像您编写此代码一样:
if ((!a && b) || c || d) // if (false || true || true)
cout << "run";
else
cout << "pass";
当然,if
语句按true传递,因为c
和d
都在开始时都设置为true
。
答案 2 :(得分:4)
运算符优先级,如您在此处看到的:https://en.cppreference.com/w/cpp/language/operator_precedence 表示&&将在||之前求值。
答案 3 :(得分:3)
Tim和Miles的答案正确,您应该接受其中之一。
我也想在这里解释一个编程概念,如果您打算为工作编写代码,这一点很重要。
了解运算符优先级的事情非常重要,但是您可能不想在行为不当时尝试检查所有代码。因此,非常明确地编写代码是有帮助的。我会执行以下操作来代替您写的内容:
context.ShouldRenew
想写作吗?是。想读书吗?也许。想了解您在做什么?不,绝对不是。尤其是从现在开始的两个月,当您尝试调试棘手的情况时,不记得为什么会有这么长的逻辑字符串。
带注释甚至更好:
bool should_run(bool a, bool b, bool c, bool d) {
if( ! a ) {
return true;
}
return b || c || d;
}
if( should_run(a, b, c, d)) {
cout << "run";
} else {
cout << "pass";
}
对于那些会抱怨执行效率的人:编译器可以通过内联在很大程度上优化它。如果没有,我说“首先使它起作用,然后当您发现问题时,使其更快地起作用”。毕竟, “ Premature optimization is the root of all evil (or at least of most of it) in programming”。
答案 4 :(得分:0)
操作具有优先级,并且具有相同优先级值的操作将从左到右顺序执行。