请解释为什么这些逻辑运算符在CPP中似乎不能正常工作

对不起,如果这是一个菜鸟问题或格式奇怪,我是编程新手,也是 StackOverflow 的新手。所以我的兄弟和我试图编写一个使用 do-while 循环和其中的 switch 语句的短程序。这是代码的简短版本,说明了我们遇到的问题。

#include <iostream>

int main()
{
    char selection{};

    do {
        std::cin >> selection;
        switch (selection) {
        case 'P':
        case 'p':
            std::cout << "This doesn't work";
        case 'Q':
        case 'q':
            std::cout << "Okay, goodbye!";
            break;
        }
    } while ( selection != 'Q' || selection != 'q');
}

我们感到困惑的是,当我们运行这个程序时,选择 Q 或 q 并没有像我们希望的那样退出循环。如果我没记错的话(很可能是错的)“!=”基本上是说“不等于”。因此,虽然的最后一行应该等同于“虽然选择不等于q或选择不等于q”,但是只要选择等于q或q,虽然评估为false,但循环被退出。

然而,当我们运行循环时,它永远不会评估为假,而是一直不断地要求我们进行选择。经过一个小时左右的谷歌搜索,我们找到了两种以我们希望的方式运行的解决方案之一。A: while (!( selection == 'Q' || selection == 'q')) 或 B: while (selection != 'Q' && selection != 'q')。无论哪种情况,循环都成功退出,程序按照我们希望的方式运行。

这很好,但无论我们在网上阅读什么,我们都找不到一个很好的解释来解释为什么原始代码没有按照它应该的方式运行。我和我的兄弟得出的结论是,它要么与优先级/结合性有关,要么与逻辑运算符相互交互的方式有关。如果有人能就原始代码为什么没有按照我们认为应该的方式运行给出一个有根据的答案,我们将不胜感激。

回答

selection != 'Q' || selection != 'q'非常仔细地阅读条件 ( ),逐个标记:

“做...而选择不等于'Q'或,而它不等于'q'”。

由于选择不能同时是 q 和 Q,所以它总是不等于 q,或不等于 Q,或两者兼而有之。

你的意图是说“做......而选择既不是'q'也不是'Q'”。可以翻译为:

!(selection == 'q' || selection == 'Q')

应用DeMorgan 身份允许您将其重写为:

(selection != 'q' && selection != 'Q')

这在结构上相似,但与原始条件略有不同,因为它使用&&而不是||. 区别在于对布尔逻辑/布尔代数的简单而常见的1误解,而不是运算符优先级或结合性。

1从在 ECE 部门辅导数字设计以及辅导 CS 的背景


回答

} while ( selection != 'Q' || selection != 'q');

这将永远是真的。每个字符要么不是Q,要么不是q。你可能想要一个&&在那里。要循环如果选择既是非q非q。

我们来看几个案例:

选择。. . 选择!='Q' 。. 选择!='q' 。. . OR

X 的结果。. . . . . . . . 真的 。. . . . . . . . . . 真的 。. . . . . . . . . ..真正的
Q值。. . . . . . . . 真的 。. . . . . . . . . . 错误的 。. . . . . . . . . . 真
Q。. . . . . . . 。错误的 。. . . . . . . . . 。真的 。. . . . . . . . . .. 真的
。. . . . . . . . 真的 。. . . . . . . . . . 真的 。. . . . . . . . . .. 真的

看到问题了吗?的结果||始终为真,因此您的循环永远不会结束。


以上是请解释为什么这些逻辑运算符在CPP中似乎不能正常工作的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>