【问题标题】:Java: Checking contents of char variable with if conditionJava:使用 if 条件检查 char 变量的内容
【发布时间】:2011-01-16 10:32:51
【问题描述】:
我有一个应该包含 Y、y、n 或 N 字符的 char 变量,我想测试它是否不包含它,然后显示错误消息并退出程序。
这是我正在使用的代码;
if (userDecision != 'Y' || userDecision != 'y' || userDecision != 'n' || userDecision != 'N')
{
System.out.println("Error: invalid input entered for the interstate question");
System.exit(0);
}
不管变量中有什么,它总是返回true并执行退出程序的命令,我做错了什么?
【问题讨论】:
标签:
java
variables
conditional
char
if-statement
【解决方案1】:
|| 表示逻辑或。你想要&&。
if (userDecision != 'Y' && userDecision != 'y' ...
如果
either a
or b 为真,
a || b 返回真。假设userDecision 是'Y'。那么
-
userDecision != 'Y' 是假的
-
userDecision != 'y' 是真的
-
userDecision != 'N' 是真的
-
userDecision != 'n' 是真的
所以条件为真,if 分支一起执行。
OTOH,a && b 如果 a 和 b 都为真,则返回真,这是您真正需要的。
【解决方案2】:
大声朗读条件的第一部分:选择与Y 或y 不同吗?问题是任何字符都不同于Y 或y。您选择了错误的逻辑运算符 - 如果您想确保用户选择了条件中的字符以外的其他内容,您必须选择 &&,逻辑和:字符是否不同于 Y 和也不同于y和等
【解决方案3】:
您的条件是“如果这不是 a 或不是 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】:
将您的 OR 更改为 AND
或者你可以使用
(!(userDecision == 'Y' || userDecision == 'y' || userDecision == 'n' || userDecision == 'N'))
这个
!(A OR B)
等价于
!A AND !B
看看Boolean algebra
德摩根定理
NOT (P OR Q) = (NOT P) AND (NOT Q)
NOT (P AND Q) = (NOT P) OR (NOT Q)
DeMorgan's Theorem
【解决方案5】:
您需要使用&& 而不是||。您是在询问这些字符中的“无”是否匹配,而不仅仅是四个字符中的任何一个是否不匹配。 (一个值不能同时是 Y、y、N 和 n。)