java - java中while语句的三个条件

标签 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);

}

最佳答案

这只是简单的 boolean 逻辑。你可以自己尝试一下。假设 Ran1 为 3,Ran2 为 4,Ran3 为 3。表达式的计算结果是什么?

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

这些并不全是 True,因此将它们AND放在一起是 False,并且您的循环将中断。但这不是您想要的,您希望只有当它们都相同时才为 False。如果您注意到,按照您现在的方式,如果三个变量中的任何一个等于任何其他变量,循环就会中断。

从积极的角度思考比从双重否定的角度思考更容易。什么时候所有变量都相同?当 Ran1 == Ran2Ran1 == Ran3Ran2 == Ran3 时,或者,用 Java 语法:

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

现在,只要这成立,您就希望循环继续,因此请确保将其括在括号中并使用 NOT 运算符 !:

while (!(Ran1 == Ran2 && Ran1 == Ran3 && Ran2 == Ran3)) {
    ...
}
<小时/>

就是这样,但是如果您不想使用括号,那么您可以简单地使用 boolean 逻辑来表达表达式。 !(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 只会继续循环,只要 all三个变量对不相等

关于java - java中while语句的三个条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15490206/

相关文章:

c - 错误: request for member ‘txt’ in something not a structure or union

c# - n 中至多有一个字段不为空

c# - 在 C# 中将 ushort 值转换为两个字节值

java - 如何在Java中使用正则表达式分隔文本?

java - 仅渲染 JTable 模型的一部分

Java 到 Kotlin 泛型的翻译

c - 仅使用按位运算符实现逻辑非(除了!)

java - 调用notifyDataSetChanged后 ListView 更新不起作用

java - 虽然不是(或同等)java

java - 重复使用while循环的问题