为啥 str != "hello" && "goodbye" 不起作用?

Posted

技术标签:

【中文标题】为啥 str != "hello" && "goodbye" 不起作用?【英文标题】:Why doesn't str != "hello" && "goodbye" work?为什么 str != "hello" && "goodbye" 不起作用? 【发布时间】:2019-05-08 00:50:48 【问题描述】:

如果输入了字符串“hello”或“goodbye”,我正在尝试退出“do”函数,该函数仅适用于“hello”,而不适用于“goodbye”。 谁能向我解释我的功能有什么问题? 另外,如果有更好的方法,我也想看看。 谢谢

“你好” || “再见” “你好”、“再见”

#include <iostream>
#include <string>



int main()

    std::string str;
    do 

        std::cout << "Say Hello, sir.";
        std::cin >> str;

     while (str != "Hello" && "Goodbye");

    std::cout << "You're rude, bro";

我希望在输入“Hello”或“Goodbye”后退出并继续执行 cout 语句。

【问题讨论】:

你应该写while (str != "Hello" || str != "Goodbye")。比较总是一对一的。 @lilitmouton 你可能需要 str != "Goodbye"。现在,您的第二个条件只是一个字符串,而不是您想要的布尔值。 @AlexG:这也是对比较和逻辑运算符如何协同工作的误解。您的版本将永远循环播放。 @AlexG 在您的示例中,您需要使用 &amp;&amp; 而不是 || 【参考方案1】:

条件str != "Hello" &amp;&amp; "Goodbye" 实际上是(str != "Hello") &amp;&amp; "Goodbye"&amp;&amp; 运算符不连接 != 的多个操作数。它是一个完全独立的运算符。

&amp;&amp; 的第一个操作数str != "Hello"str"Hello" 进行比较,这就是你想要的。第二个操作数 "Goodbye" 不是您想要的。

"Goodbye"&amp;&amp;的操作数时,转换为bool。 (具体来说,这个字符串字面量首先转换为指向其第一个字符的指针,然后转换为bool。)将非空指针转换为bool 的结果是true

所以str != "Hello" &amp;&amp; "Goodbye"str != "Hello" &amp;&amp; true 相同,与str != "Hello" 相同。

你想要的条件是str != "Hello" &amp;&amp; str != "Goodbye"

【讨论】:

耶!精通布尔逻辑的人! @BenVoigt 现在你让我伤心了 :'( @Swordfish:我并不是要暗示你不是,这是与之前提供的 answer 的对比。 @BenVoigt 我并没有认真对待悲伤^^【参考方案2】:

关闭,你只需要更明确。

str != "Hello" && str != "Goodbye"

您必须分别进行每个 str 比较。

【讨论】:

【参考方案3】:

您的while 代码正在评估( str != "hello" &amp;&amp; "goodbye")。在 C++ 中,这等于 ( (str != "hello") &amp;&amp; true)"Goodbye" 被评估为 true 因为它是一个字符串文字,它评估为 true 因为它不是 nullptr

你需要做(str != "Hello" &amp;&amp; str != "Goodbye")

【讨论】:

因为字符串的评估就像真正的因为已定义我不确定你在这里说什么。它评估为true,因为它是一个字符串文字,即const char*,如果不是nullptr,则指针评估为true 感谢塔斯的解释。解释已添加到我的答案中。 @Tas 因为它是一个字符串文字,它是一个 const char - 只是吹毛求疵:字符串文字的类型是 N 数组 const char 一个字符串文字,如果它们不是 nullptr,则评估为 true。 - 由于字符串文字不能是 nullptr,它们始终是 true

以上是关于为啥 str != "hello" && "goodbye" 不起作用?的主要内容,如果未能解决你的问题,请参考以下文章

String str1="Hello",String str2=new String("Hello")

android 怎么用base64 加密imageview

C语言文件问题:为啥下面程序会有乱码输出?

Python:为啥 ("hello" is "hello") 评估为 True? [复制]

Python:为啥 ("hello" is "hello") 评估为 True? [复制]

为啥str主要存在于其借来的? [复制]