java中while语句中的三个条件

时间:2013-03-19 01:53:41

标签: java while-loop boolean-logic

这是错的吗?当Ran1,Ran2,Ran3都相同时,我想退出while循环。 TNX

Random RandomNumber = new Random();
int Ran1 = RandomNumber.nextInt(4);
int Ran2 = RandomNumber.nextInt(4);
int Ran3 = RandomNumber.nextInt(4);

while (Ran1 != Ran2 && Ran1 != Ran3 && Ran2 != Ran3 ){
    Ran1 = RandomNumber.nextInt(4);
    Ran2 = RandomNumber.nextInt(4);
    Ran3 = RandomNumber.nextInt(4);
    System.out.print(Ran1);
    System.out.print(" ");
    System.out.print(Ran2);
    System.out.print(" ");
    System.out.println(Ran3);

}

4 个答案:

答案 0 :(得分:6)

这只是简单的布尔逻辑。你可以自己试试。假设Ran1为3,Ran2为4,Ran3为3.表达式将评估什么?

Ran1 != Ran2 -> 3 != 4 -> True
Ran1 != Ran3 -> 3 != 3 -> False
Ran2 != Ran3 -> 4 != 3 -> True

这些都不是真的,所以AND将它们放在一起是假的,你的循环会破裂。但那并不是你想要的,你希望它们只有在它们完全相同时才是假的。如果您注意到现在的方式,如果三个变量中的任何一个等于任何其他变量,则循环中断。

从积极而非双重否定的角度来思考更容易。什么时候变量都一样?它是Ran1 == Ran2Ran1 == Ran3Ran2 == Ran3的时候,或者是Java语法:

Ran1 == Ran2 && Ran1 == Ran3 && Ran2 == Ran3

现在,只要为true,您就希望循环继续,因此请确保将其包装在括号中并使用NOT运算符!

while (!(Ran1 == Ran2 && Ran1 == Ran3 && Ran2 == Ran3)) {
    ...
}

就是这样,但如果您不想使用括号,那么您可以使用布尔逻辑简单地表达式。 !(A && B)!A || !B相同:

A  |  B  |  A && B  |  ! (A && B)  | !A  |  !B  |  !A || !B
---+-----+----------+--------------+-----+------+-----------
T  |  T  |    T     |       F      |  F  |   F  |     F
T  |  F  |    F     |       T      |  F  |   T  |     T
F  |  T  |    F     |       T      |  T  |   F  |     T
F  |  F  |    F     |       T      |  T  |   T  |     T

您可以自行验证!(A && B && C)!A || !B || !C是否相同。因此,您可以将上述while循环转换为:

while (!(Ran1 == Ran2) || !(Ran1 == Ran3) || !(Ran2 == Ran3)) {
    ...
}

或:

while (Ran1 != Ran2 || Ran1 != Ran3 || Ran2 != Ran3) {
    ...
}

在用词语推理时:只要 任何 三个变量对不相等,你就希望循环继续。您的初始表达式Ran1 != Ran2 && Ran1 != Ran3 && Ran2 != Ran3只会继续循环,只要 所有 三个变量对不相等

答案 1 :(得分:4)

当它们完全相同时,你想退出循环。由于平等为transitive,您知道如果A == B && B == CA == C。这意味着您可以在

时退出
Ran1 == Ran2 && Ran1 == Ran3

所以你必须保持在循环中,直到前一个条件的否定为止:

! (Ran1 == Ran2 && Ran1 == Ran3)

使用De Morgan's law等同于:

Ran1 != Ran2 || Ran1 != Ran3

答案 2 :(得分:0)

从逻辑上讲,你很好,但它可以更短/更容易阅读。你想在条件中使用NOT运算符(!),因为你就是这么想的:

while ( !  ( ( Ran1 == Ran2) && (Ran1 == Ran3) ) )

答案 3 :(得分:0)

你想继续迭代,而3个值彼此不同,所以表达条件的方式是

while(Ran1 != Ran2 || Ran2 != Ran3 )

因为隐含地意味着Ran1和Ran3在你将Ran2与其他的比较之后是相等的

顺便说一下,你可以简化你的

System.out.print(Ran1);
System.out.print(" ");
System.out.print(Ran2);
System.out.print(" ");
System.out.println(Ran3);

使用单曲:

System.out.println(Ran1 + " " Ran2 + " " + Ran3);