2
#include <iostream>
#include <string>

using namespace std;

int main()
{
    string option;
    cout << "Would like water, beer, or rum?--> ";
    cin >> option;
    while( option != "water" || option != "beer" || option != "rum" )
        {
        cout << "You did not choose a valid option. Try again.\n";
        cout << "Would you like water, beer, or rum?-->";
        cin >> option;
        }
}

为什么即使用户输入了正确的选项,这段代码也不会退出循环?

4

6 回答 6

11

大声朗读您的条件-“在option不是"water" option不是"beer" ...时运行循环”。

什么时候应该停止?

于 2013-06-20T18:37:05.050 回答
3

您使用了错误的逻辑运算符。您希望所有条件都为真(option不等于水,不等于啤酒,也不等于朗姆酒),因此您应该使用and ( &&)。Or ( ||) 表示如果任何条件为真,则表达式为真,并且由于值是互斥的,因此总是如此,因此您的无限循环。

于 2013-06-20T18:36:38.820 回答
2

||的 s 应该是&&s 因为 aoption只能有一个值。

while (option != "water" && option != "beer" && option != "rum")
{
   // ...
}
于 2013-06-20T18:36:29.833 回答
1

这句话总是正确的:

option != "water" || option != "beer" || option != "rum"

如果option是“水”,那么它就不是“啤酒”,所以这个陈述是正确的。如果option是“啤酒”,它不是“水”,那么这个陈述是正确的(当然,假设你有一杯好啤酒。)

我想你是想写

option != "water" && option != "beer" && option != "rum"

这样一来,一旦option采用这些值中的任何一个,循环就会退出。

希望这可以帮助!

于 2013-06-20T18:37:27.310 回答
0

几乎总是!= ||序列是错误的,应该使用 &&。如果一个比较失败,则其他比较为真,因此整个条件始终为真。如果你不等于一个人,你肯定不等于别人。

有了经验,你会很想看到这样的结构。

于 2013-06-20T18:38:08.160 回答
0

您可以使用容器来存储有效选项并检查选择是否在容器中:

set<string> validOptions = { "water", "beer", "rum"};

while(validOptions.count(option) == 0) {
    // .. etc
}
于 2013-06-20T18:46:17.440 回答