我有一个char变量,应该包含Y,y,n或N字符,我想测试它是否包含它,然后显示错误消息并退出程序。
这是我正在使用的代码;
if (userDecision != 'Y' || userDecision != 'y' || userDecision != 'n' || userDecision != 'N')
{
System.out.println("Error: invalid input entered for the interstate question");
System.exit(0);
}
无论变量中的内容是什么,它总是返回true并执行退出程序的命令,我做错了什么?
答案 0 :(得分:3)
||
表示逻辑或。您想要&&
。
if (userDecision != 'Y' && userDecision != 'y' ...
a || b
返回true。假设userDecision
为'Y'
。然后
userDecision != 'Y'
是假的userDecision != 'y'
是真的userDecision != 'N'
是真的userDecision != 'n'
是真的因此,条件为真,并执行if分支。
OTOH,a && b
如果 和 b都为真,则返回true,这是您真正需要的。
答案 1 :(得分:2)
大声朗读条件的第一部分:选择是否与Y
或y
不同?问题是任何字符都不同于Y
或y
。您选择了错误的逻辑运算符 - 如果您想确保用户选择了除条件中的那些字符以外的其他内容,则必须选择&&
,逻辑和:字符是否与Y
不同和也与y
和等不同。
答案 2 :(得分:2)
将yoiur OR更改为ANDs
或者你可以使用
(!(userDecision == 'Y' || userDecision == 'y' || userDecision == 'n' || userDecision == 'N'))
此
!(A OR B)
等同于
!A AND !B
De Morgans定理
NOT (P OR Q) = (NOT P) AND (NOT Q)
NOT (P AND Q) = (NOT P) OR (NOT Q)
答案 3 :(得分:2)
你的条件是“如果这不是或不是b”,这意味着即使它是a或b也总是如此。你要测试的是“如果不是(a或b)”那么:
if (! (userDecision == 'Y' || userDecision == 'y' || userDecision == 'n' || userDecision == 'N')) {
System.out.println("Error: invalid input entered for the interstate question");
System.exit(0);
}
如果你的代码包含这样的条件,因为必须测试许多替代字符,你可以使用switch构造,这使得这种情况更容易理解:
switch (userDecision) {
case 'y': /*fallthrough*/
case 'Y':
// accepted
break;
case 'n': /*fallthrough*/
case 'N':
// rejected
break;
default:
System.out.println("Error: invalid input entered for the interstate question");
System.exit(0);
}
答案 4 :(得分:1)
您需要使用&&
代替||
。您在询问这些字符中的“无”是否匹配,而不仅仅是四个中的任何一个是否匹配。 (值不能同时为Y,y,N和n。)