为啥 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 在您的示例中,您需要使用 &&
而不是 ||
【参考方案1】:
条件str != "Hello" && "Goodbye"
实际上是(str != "Hello") && "Goodbye"
。 &&
运算符不连接 !=
的多个操作数。它是一个完全独立的运算符。
&&
的第一个操作数str != "Hello"
将str
与"Hello"
进行比较,这就是你想要的。第二个操作数 "Goodbye"
不是您想要的。
当"Goodbye"
是&&
的操作数时,转换为bool
。 (具体来说,这个字符串字面量首先转换为指向其第一个字符的指针,然后转换为bool
。)将非空指针转换为bool
的结果是true
。
所以str != "Hello" && "Goodbye"
与str != "Hello" && true
相同,与str != "Hello"
相同。
你想要的条件是str != "Hello" && str != "Goodbye"
。
【讨论】:
耶!精通布尔逻辑的人! @BenVoigt 现在你让我伤心了 :'( @Swordfish:我并不是要暗示你不是,这是与之前提供的 answer 的对比。 @BenVoigt 我并没有认真对待悲伤^^【参考方案2】:关闭,你只需要更明确。
str != "Hello" && str != "Goodbye"
您必须分别进行每个 str 比较。
【讨论】:
【参考方案3】:您的while
代码正在评估( str != "hello" && "goodbye")
。在 C++ 中,这等于 ( (str != "hello") && true)
。 "Goodbye"
被评估为 true 因为它是一个字符串文字,它评估为 true 因为它不是 nullptr
。
你需要做(str != "Hello" && 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")
Python:为啥 ("hello" is "hello") 评估为 True? [复制]