为什么在带有多个AND OR的If语句中添加方括号会给出不同的结果?

时间:2019-07-15 05:21:50

标签: c++ if-statement logical-operators

我有一个简单的程序,具有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。为什么这样工作?

5 个答案:

答案 0 :(得分:8)

这是因为逻辑和运算符(&&)比逻辑或运算符(||和逻辑取反运算符(!)具有更高的precedence在这三个中优先级最高。

这意味着表达式!a && b || c || d被分组为((((!a) && b) || c) || d)。由内而外地工作:

  • !afalse-> (((false && b) || c) || d)
  • false && bfalse-> ((false || c) || d)
  • false || ctrue-> (true || d)
  • true || dtrue-> true

因此整个表达式的计算结果为true

答案 1 :(得分:4)

在C ++(以及大多数其他编程语言)中,&&运算符的优先级||大。因此,您的第一个版本的代码实际上正在执行,就像您编写此代码一样:

if ((!a && b) || c || d)  // if (false || true || true)
    cout << "run";
else
    cout << "pass";

当然,if语句按true传递,因为cd都在开始时都设置为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)

操作具有优先级,并且具有相同优先级值的操作将从左到右顺序执行。