我正在使用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循环中获得更多条件并使其工作?
答案 0 :(得分:5)
您需要使用&&
代替||
,因为使用||
while
中的条件始终为true
。例如,当你写“r”时,条件userinput != r
为假,但其余条件为真,&&
所有表达式都转向false
,while
结束。
答案 1 :(得分:2)
Why does the above condition not work?
原因是因为如果你说x is not 3 or x is not 5
,那么如果x
是3
,那么x
不是5
,所以整个语句评估为真正。您的userInput != 'r'
和userInput != 'p'
与x
的情况类似。
为了显示它更简单,我将显示or
的真值表。当表达式的计算结果为true时,您的while循环将继续低于这些情况,其中p
和q
是可能为真或假的语句,如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")) {
然后,只要userInput
与r
,p
,R
或P
中的任何一个都不匹配,就会退出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循环退出。