【问题标题】:Unknown behaviour of OR operator in C++ [duplicate]C ++中OR运算符的未知行为[重复]
【发布时间】:2018-04-27 04:31:07
【问题描述】:

我偶然运行了这段代码,当我把任何东西作为答案时,它显示我是正确的。我知道我们必须把 ans 放在 YES 和 yay 之前,但是这段代码也被编译了,正如我提到的,如果我把任何单词作为输入输出是正确的:

string ans;
cin >> ans;

if(ans == "yes" || "YES" || "yay") {
    cout << "Correct";
}else {
    cout << "Incorrect";
}

【问题讨论】:

  • 布尔运算符不是这样工作的。他们所做的只是获取两个布尔值(真或假)并返回一个布尔值。这是他们唯一做的事情。
  • 任何非零都是真的。 "YES" 总是正确的。 "yay" 总是正确的。您忘记将它们与某些东西进行比较。
  • 应该在某个地方被骗了。
  • @Shahryar downvotes 很可能是因为这个问题每隔一天被问一次,并且通过处理声明并考虑operator precedence 很容易解释。我不会对这个投反对票,因为就像我在上面所说的那样,网络搜索真的很难。
  • 有人应该提出一个规范的“为什么我与多个值的比较总是返回真”的问题。

标签: c++ logic


【解决方案1】:

好的,这是逻辑运算符的优先级 (L->R) 和结合性:

(((ans == "yes") || "YES") || "yay")

由于 C/C++ 与 Python 不同,没有链接

第一个:ans == "yes" -> strstr 比较

第二个:bool result of 1st || "YES" -> boolstr 比较 = 总是 true for "YES" 不为空

第三个:true || "YES" = 总是true

因此,对于"YES""yay" 不为空,条件将始终为true

【讨论】:

  • 谢谢我现在明白了。
  • "always true for "YES" is not empty" 不太正确。它总是正确的,因为“YES”是一个非空指针。 if ("") 也是真的
  • @AlanBirtles,已修改。谢谢!
【解决方案2】:

你的优先顺序错了。

if (var == A || B || C) 表示“如果(var 等于 A)OR(B 不为零)OR(C 不为零)”

你想做if (var == A || var == B || var == C)。这意味着“如果(var 等于 A)OR(var 等于 B)或(var 等于 C)”

【讨论】:

  • 我知道逻辑上的 OR 是什么。但是,如果我输入任何内容,即使我输入“否”,我也会得到正确的输出。我知道工作形式是写 ans=="yes" || ans=="是" || ans=="yay",但为什么问题中的表格会这样工作。
  • 因为“YES”是一个非零值,所以在if语句里面,它总是为真。
【解决方案3】:

您应该将 ans 与每个值进行比较。与值的每个比较不是“0”或“失败”值被假定为“真”。因此,如果您输入 if("yes") 之类的 if 条件,它总是返回 true。

int main()
{
    std::string ans;
    std::cin >> ans;

    if("yes" == ans || "YES" == ans || "yay" == ans)
    {
        std::cout << "Correct\n";
    }
    else
    {
        std::cout << "Incorrect";
    }
}

【讨论】:

    猜你喜欢
    • 2016-07-02
    • 1970-01-01
    • 2015-03-16
    • 2017-03-20
    • 1970-01-01
    • 2018-03-30
    • 2010-10-23
    • 2018-04-17
    • 2019-12-31
    相关资源
    最近更新 更多