如何在一个while循环中获得多个条件?

时间:2017-11-20 23:12:33

标签: c++ visual-studio

我正在使用while循环,我想用户输入r,R,p或P.但是当我添加多个条件时,如:

while ((userInput != "r") || (userInput != "p" || (userInput != "R") || (userInput!= "P")) {
    cout << "Please enter a valid option" << endl;
    cin >> userInput;
}

我的程序将永远停留在循环中。好像我这样输入:

while (userInput != "r") {
    cout << "Please enter a valid option" << endl;
    cin >> userInput;
}

如果用户输入“r”,我的代码将退出for循环 那么为什么第一块代码不起作用呢?我没有错误,这意味着它必须是一个逻辑错误,但我不明白。如何在for循环中获得更多条件并使其工作?

2 个答案:

答案 0 :(得分:5)

您需要使用&&代替||,因为使用|| while中的条件始终为true。例如,当你写“r”时,条件userinput != r为假,但其余条件为真,&&所有表达式都转向falsewhile结束。

答案 1 :(得分:2)

Why does the above condition not work?

原因是因为如果你说x is not 3 or x is not 5,那么如果x3,那么x不是5,所以整个语句评估为真正。您的userInput != 'r'userInput != 'p'x的情况类似。

为了显示它更简单,我将显示or的真值表。当表达式的计算结果为true时,您的while循环将继续低于这些情况,其中pq是可能为真或假的语句,如userInput != 'r'

||  -- or
 q\p|_T_|_F_|
 _T_|_T_|_T_|
 _F_|_T_|_F_|

这意味着使用or子句,唯一的方法就是假如果所有部分都是假的。

And子句似乎是您想要的。它的真相表是:

&&  -- and
 q\p|_T_|_F_|
 _T_|_T_|_F_|
 _F_|_F_|_F_|

意思是,对于and子句,如果所有子句都为真,唯一的方法就是为真。

因此,如果您希望响应既不是r也不是p,R也不是R等,请使用&&作为和:

while ((userInput != "r") && (userInput != "p") && (userInput != "R") && (userInput!= "P")) {

然后,只要userInputrpRP中的任何一个都不匹配,就会退出while循环。这是因为在程序评估时,它会检查:

以userInput为例“g”:

userInput g是否等于r?不,所以第一个条款是True。 userInput g是否等于p?不,所以第二个条款是真的。 userInput g是否等于R?不,所以第三个条款是真的。 userInput g是否等于P?不,所以第四个条款是真的。由于所有四个都是真的,所以整个陈述都是真的,而while循环继续。

以userInput为例“R”:

userInput g是否等于R?不,所以第一个条款是True。 userInput g是否等于R?不,所以第二个条款是真的。 userInput g是否等于R?是。所以第三个条款是假的。由于语句的一部分是false,因此整个和子句都是false,因此while循环退出。