1

我正在尝试在 while 循环中使用 equalsIgnoreCase() 来尝试检查是否使用 NOT (!) 运算符编写了预期写入的内容之外的内容。例如:

String temp="A";
boolean x =(!temp.equalsIgnoreCase("a")) ;

看,这适用于 while 循环。如果不是 A,它将继续循环,但下一行不会

boolean x =(!temp.equalsIgnoreCase("a") || !temp.equalsIgnoreCase("b")) ;

这似乎不再起作用了。这将返回 true,无论您键入什么,即使它是 a 或 b。因此,当我使用整行代码检查任何不应该使用的字母时:

while (!temp.equalsIgnoreCase("A") || !(temp.equalsIgnoreCase("B")) ||!temp.equalsIgnoreCase("D")|| !temp.equalsIgnoreCase("P") || !temp.equalsIgnoreCase("S"))
{ ***Do Code***}

它会循环您输入的任何内容,即使它等于其中一个字母。

当有多个 !temp.equalsIngnoreCase 时,代码不能使用 OR (||)。

我可以让它工作的唯一方法是将 OR 更改为 AND

while (!temp.equalsIgnoreCase("A") && !(temp.equalsIgnoreCase("B")) && !temp.equalsIgnoreCase("D")&& !temp.equalsIgnoreCase("P") && !temp.equalsIgnoreCase("S"))

即使我似乎找到了解决方案,但我仍然不明白为什么 OR 不起作用但 AND 起作用。我删除了 NOT 以查看是否一切正常,当输入其中一个字母时,它似乎完美循环。

4

4 回答 4

3

它会循环您输入的任何内容,即使它等于其中一个字母。

是的,当然可以。

你要求它在它不是A 它不是时继续运行B。好吧,没有什么可以两者兼而有之 ……如果该值等于,那么它将不等于,因此第一个操作数将保持循环继续进行。如果该值等于,那么它将不等于,因此第二个操作数将保持循环继续进行。ABBAAB

您更改为 AND 的解决方案是正确的 - 您希望值不是A 不是B(即它既不是 A也不是B)。

或者,您可以在内部使用 OR,但在整个事情上加上 NOT:

while (! (temp.equalsIgnoredCase("A") || temp.equalsIgnoreCase("B") || ...))
于 2013-07-28T20:06:41.817 回答
2

我仍然不明白为什么 OR 不起作用但 AND 起作用

在temp的任何给定值下,表达式 using||将始终为。因为,temp不能同时是两者。如果是,那么 的第二部分将为true,如果它等于或任何其他值,则第一部分将为true,从而使整个表达式在两种情况下都为true 。aba||b

有了,如果temp既不是也不是&&,你while只会是。trueab

或者,如果您要针对多个值测试temp,您可以更改while条件以使其看起来更简单:

while (!"ABDPS".contains(temp.toUpperCase())) {

}
于 2013-07-28T20:08:04.653 回答
1

这是一个错误的逻辑。编码

(!temp.equalsIgnoreCase("A") || !(temp.equalsIgnoreCase("B")) ||!temp.equalsIgnoreCase("D")|| !temp.equalsIgnoreCase("P") || !temp.equalsIgnoreCase("S"))

方法

如果 char 不是 A,或者不是 B,或者不是 D,或者不是 P,或者不是 S。它总是评估为真,因为 char 是 A,它既不是 B,D,S 也不是 P。对于其他。

如果你希望它是 OR 逻辑,它应该是:

(!(temp.equalsIgnoreCase("A") || (temp.equalsIgnoreCase("B")) ||temp.equalsIgnoreCase("D")|| temp.equalsIgnoreCase("P") || temp.equalsIgnoreCase("S")))

这意味着,不是当 char 是 A、B、D、S 或 P

于 2013-07-28T20:08:33.613 回答
0

这都是关于逻辑的。

A OR B 表示当 A 为真或 B 为真或两者都为真时为真。

在您的特殊情况下,您的 equalsIgnorecase() 之一可能永远工作,因此您编写了类似重言式的东西,这意味着无限循环。您可以在此处阅读有关布尔代数的信息:http ://en.wikipedia.org/wiki/Boolean_algebra_%28structure%29

有点理论,但它解释了您在编写布尔表达式时需要知道的内容。希望这可以帮助 :)

于 2013-07-28T20:12:30.900 回答