Java 为什么两个相同的while循环行为不同

Java 为什么两个相同的while循环行为不同,java,arithmetic-expressions,Java,Arithmetic Expressions,我已经挣扎了几个小时,找不到合理的解释。 下面是一个代码: int num = 1; while (num++ < 5); System.out.println(num); // Why num == 6 ?? 所以,问题是为什么num==6? 我认为此代码与以下代码相同: int num = 1; while (num < 5) num++; System.out.println(num); // num == 5 您的第一个while循环不执行任何操作,除了递增num之外-

我已经挣扎了几个小时,找不到合理的解释。 下面是一个代码:

int num = 1;
while (num++ < 5); 
System.out.println(num); // Why num == 6 ??
所以,问题是为什么num==6? 我认为此代码与以下代码相同:

int num = 1;
while (num < 5) num++;
System.out.println(num); // num == 5
您的第一个while循环不执行任何操作,除了递增num之外-请参阅while语句后面的分号

由于一元增量在条件之后计算,num++<5将递增num直到其值为6,因为终止条件为num==5,然后num再次递增一次

在第二个示例中,num仅在条件适用时才递增,因此比第一个示例少一次

例1

将1分配给num 迭代数值:1增量是否晚于5?对 迭代数值:2的增量是否小于5?对 迭代数值:3的增量是否小于5?对 迭代数:4的增量是否小于5?对 迭代数值:5增量是否小于5?不,停下来 此时,num仍然增加1,因此num==6 例2

将1分配给num 迭代数:1是否小于5?是的,因此递增num 迭代数:2是否小于5?是的,因此递增num 迭代数:3是否小于5?是的,因此递增num 迭代数:4是否小于5?是的,因此递增num 迭代数:5是否小于5?否,停止而不递增 因此,num==5 您的第一个while循环不执行任何操作,除了递增num之外-请参阅while语句后面的分号

由于一元增量在条件之后计算,num++<5将递增num直到其值为6,因为终止条件为num==5,然后num再次递增一次

在第二个示例中,num仅在条件适用时才递增,因此比第一个示例少一次

例1

将1分配给num 迭代数值:1增量是否晚于5?对 迭代数值:2的增量是否小于5?对 迭代数值:3的增量是否小于5?对 迭代数:4的增量是否小于5?对 迭代数值:5增量是否小于5?不,停下来 此时,num仍然增加1,因此num==6 例2

将1分配给num 迭代数:1是否小于5?是的,因此递增num 迭代数:2是否小于5?是的,因此递增num 迭代数:3是否小于5?是的,因此递增num 迭代数:4是否小于5?是的,因此递增num 迭代数:5是否小于5?否,停止而不递增 因此,num==5
原因是比较是在num的增量之前完成的。因此num等于5时的步骤如下所示:

num = 5
num < 5, so exit loop
num++
num = 6
print num

是否使用了预增量,如while++num<5;那么num在循环结束时应该是5。

原因是比较是在num的增量之前完成的。因此num等于5时的步骤如下所示:

num = 5
num < 5, so exit loop
num++
num = 6
print num
是否使用了预增量,如while++num<5;那么num在循环结束时应该是5;将首先将num与value进行比较,然后将其递增。例如,当num->5时,则5<5为false,因此循环将终止,但++将使num增加1

然而,在第二个示例中,即当num<5时,循环将在num->5和num++永远不会被调用时终止,因此num将是5而不是6;将首先将num与value进行比较,然后将其递增。例如,当num->5时,则5<5为false,因此循环将终止,但++将使num增加1

int num = 1;
while (num++ < 5); 
System.out.println(num);
然而,在第二个示例中,即当num<5时,循环将在num->5时终止,并且num++将永远不会被调用,因此num将是5而不是6

int num = 1;
while (num++ < 5); 
System.out.println(num);
这里的num每次都被比较和递增。因此,对于最后一次迭代,num增加,但条件失败。所以输出是6

int num = 1;
while (num < 5) num++;
System.out.println(num);
在这里,您将num与5进行比较,并递增num。对于上一次迭代,条件失败并且没有递增num。因此,输出为5

while (num++ < 5); 
这里的num每次都被比较和递增。因此,对于最后一次迭代,num增加,但条件失败。所以输出是6

int num = 1;
while (num < 5) num++;
System.out.println(num);
在这里,您将num与5进行比较,并递增num。对于上一次迭代,条件失败并且没有递增num。因此,输出为5

while (num++ < 5); 
第一次检查:1<5=正确;检查后:i=2; 第二次检查:2<5=正确;检查后:i=3; 第三次检查:3<5=正确;检查后:i=4; 第四次检查:4<5=正确;检查后:i=5; 第五次检查:5<5=错误;检查后:i=6;打破循环; 第一次检查:1<5=正确;检查后:i=2; 第二次检查:2<5=正确;检查后:i=3; 第三次检查:3<5=正确;检查后:i=4; 第四次检查:4<5=正确;检查后:i=5; 第五次检查:5<5=错误;打破循环; 第一次检查:1<5=正确;检查后:i=2; 第二次检查:2<5=正确;检查后:i=3; 第三次检查:3<5=正确;检查后:i=4; 第四次检查:4<5=正确;检查后:i=5; 第五次检查:5<5=错误;检查后:i=6;打破循环; 第一张支票:1 <5=正确;检查后:i=2; 第二次检查:2<5=正确;检查后:i=3; 第三次检查:3<5=正确;检查后:i=4; 第四次检查:4<5=正确;检查后:i=5; 第五次检查:5<5=错误;打破循环; 在这里,您在检查后增加了值

如果您正在寻找相同的循环,那么您需要执行一个类似as++num的增量,称为前缀,而不是称为后缀的num++,这样您的代码看起来就像

int num = 1;
while (++num < 5);
System.out.println(num);
现在,上述条件与

int num = 1;
while (num < 5) num++;
System.out.println(num);
在这里,您在检查后增加了值

如果您正在寻找相同的循环,那么您需要执行一个类似as++num的增量,称为前缀,而不是称为后缀的num++,这样您的代码看起来就像

int num = 1;
while (++num < 5);
System.out.println(num);
现在,上述条件与

int num = 1;
while (num < 5) num++;
System.out.println(num);
因为num++是一个表达式,其值为num的未加增量值,而num++<5;将以num递增1超过5结束

while num<5 num++;,语句num++;将只运行到num为4:最后一次运行语句后num的值将为5。

因为num++是一个值为num的未加增量的表达式,而num++<5;将以num递增1超过5结束


while num<5 num++;,语句num++;将只运行到num为4:最后一次运行语句后num的值将为5。

在比较循环的最后一次运行中,num++<5将首先比较,然后在中断循环之前,将1添加到num。因此结果将比另一个循环高1。当条件为false时,last run num将为5。在终止循环之前,它将添加1,即num将变为6ad,然后中断。而在另一个循环中,它不会移动到循环中,因此不会增加到6。

在最后一次运行比较循环时,num++<5将首先进行比较,在打破循环之前,将1添加到num。因此结果将比另一个循环高1。当条件为false时,last run num将为5。在终止循环之前,它将添加1,即num将变为6ad,然后中断。在另一个循环中,它不会移动到循环中,因此不会增加到6。

在第一种情况下,System.out.println不在While循环体中。因为若并没有大括号,那个么它就以一条语句作为主体,这意味着第一个出现的分号是一条语句。在您的情况下,它是一个空语句

;         // is empty statement and valid

当它当时从while循环中出来num=6并在第一种情况下打印时,System.out.println不在while循环体中。因为若并没有大括号,那个么它就以一条语句作为主体,这意味着第一个出现的分号是一条语句。在您的情况下,它是一个空语句

;         // is empty statement and valid
当它当时从while循环中出来num=6时,它会在一个简单的语句中打印它

;         // is empty statement and valid

简单地说

;         // is empty statement and valid


抱歉,如果问题非常明显,为什么两个相同的while循环行为不同因为它们不一样。显然。@Anarantt对于这样的情况,如果您发现自己花费了几个小时,您可以使用调试器一步一步地查看num的值,如果您不能手动推断它的值。如果问题非常明显,那么很抱歉为什么两个相同的while循环的行为不同因为它们不一样。显然。@Anarantt对于这样的情况,如果您无法手动推断num的值,您可以使用调试器一步一步地查看num的值。