为什么两个相同的 while 循环表现不同

Why two identical while loop behave differently

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

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
  • 迭代num:是1 (increment later) < 5?是
  • 迭代num:是2 (increment later) < 5?是
  • 迭代num:是3 (increment later) < 5?是
  • 迭代num:是4 (increment later) < 5?是
  • 迭代num:是5 (increment later) < 5?不,停止
  • 此时,num 仍递增 1 因此 num == 6

示例 2

  • 1分配给num
  • 迭代num:是1 < 5?是的,因此增加 num
  • 迭代num:是2 < 5?是的,因此增加 num
  • 迭代num:是3 < 5?是的,因此增加 num
  • 迭代num:是4 < 5?是的,因此增加 num
  • 迭代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

因为 while (num++ < 5); 会先将 num 与值进行比较,然后将其递增。例如,当 num -> 55 < 5 为假,因此循环将终止,但 ++ 将使 num 递增 1.

而在第二个示例中,即 while (num < 5) 循环将在 num -> 5num++ 永远不会被调用时终止,因此 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); 
  • 第一次检查:1 < 5 = 真;检查后:i = 2;
  • 第二次检查:2 < 5 = 真;检查后:i = 3;
  • 第三次检查:3 < 5 = 真;检查后:i = 4;
  • 第四次检查:4 < 5 = 真;检查后:i = 5;
  • 第五次检查:5 < 5 = 错误;检查后:i = 6;打破循环;

while (num < 5) num++;
  • 第一次检查:1 < 5 = 真;检查后:i = 2;
  • 第二次检查:2 < 5 = 真;检查后:i = 3;
  • 第三次检查:3 < 5 = 真;检查后:i = 4;
  • 第四次检查:4 < 5 = 真;检查后:i = 5;
  • 第五次检查:5 < 5 = 错误;打破循环;
int num = 1;
while (num++ < 5); 
System.out.println(num);

在检查

之前,这里是 incrementing
int num = 1;
while (num < 5) num++;
System.out.println(num);

在这里你是 incrementing 检查后的值

如果你正在寻找相同的循环,那么你需要做一个像 ++num 这样的增量,称为 (prefix) 而不是 num++ 称为 (postfix) 所以你代码看起来像

int num = 1;
while (++num < 5);
System.out.println(num);

现在以上条件与

相同
int num = 1;
while (num < 5) num++;
System.out.println(num);

由于 num++ 是一个 表达式 ,其值为 num 的未递增值,while (num++ < 5); 将以 [=11= 结束] 在 5 之外增加 1。

使用while (num < 5) num++;语句 num++;只会是运行直到num为4: num后的语句是运行最后一次会是5.

在比较循环的最后 运行 中,num++ < 5 将首先进行比较,然后在中断循环之前将 num 加 1。所以结果将比另一个循环高 1。当条件为假时,最后 运行 num 将为 5。在终止循环之前,它会添加 1 即 num 将变为 6 广告然后中断。而在另一个循环中,它不会进入循环,因此不会增加到 6。

在您的第一种情况下,System.out.println 超出了 while 循环体。因为如果没有花括号那么它以单个语句为主体,意味着第一个出现的分号是单个语句。在您的情况下,它是空语句

;         // is empty statement and valid

当它在 num=6 的时候从 while 循环中出来并打印出

简述

$num++ < 5  =>>  $num < 5; $num = $num + 1;

++$num < 5  =>>  $num = $num + 1; $num < 5;

A​​ND

while($num < 5) $num++; =>> when (4 < 5)-->> true; --> $num = 5; 
                        =>> when (5 < 5)-->> false;--> $num = 5;;