为什么两个相同的 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 -> 5
时 5 < 5
为假,因此循环将终止,但 ++
将使 num 递增 1
.
而在第二个示例中,即 while (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);
- 第一次检查: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;
AND
while($num < 5) $num++; =>> when (4 < 5)-->> true; --> $num = 5;
=>> when (5 < 5)-->> false;--> $num = 5;;
我已经苦苦挣扎了几个小时,找不到合理的解释。 这是一个代码:
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 -> 5
时 5 < 5
为假,因此循环将终止,但 ++
将使 num 递增 1
.
而在第二个示例中,即 while (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);
- 第一次检查: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;
AND
while($num < 5) $num++; =>> when (4 < 5)-->> true; --> $num = 5;
=>> when (5 < 5)-->> false;--> $num = 5;;