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

时间:2016-02-03 09:40:23

标签: 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

10 个答案:

答案 0 :(得分:4)

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。

答案 1 :(得分:1)

你的第一个while循环没有执行任何操作,除了增加num之外 - 请在while语句后面看到分号。

由于一元增量在条件之后进行评估,num++ < 5将增加num,直到其值为6,因为终止条件为num == 5,然后{{1再次增加一次。

在您的第二个示例中,如果条件适用,num会增加 ,因此比第一个示例少一个时间。

示例1

  • num分配给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

示例2

  • num == 6分配给1
  • 迭代num:是num?是的,因此增加1 < 5
  • 迭代num:是num?是的,因此增加2 < 5
  • 迭代num:是num?是的,因此增加3 < 5
  • 迭代num:是num?是的,因此增加4 < 5
  • 迭代num:是num?不,停止而不增加
  • 因此,5 < 5

答案 2 :(得分:1)

while (num++ < 5); 
  • 第一次检查:1&lt; 5 =真;检查后:i = 2;
  • 第二次检查:2&lt; 5 =真;检查后:i = 3;
  • 第3次检查:3&lt; 5 =真;检查后:i = 4;
  • 第4次检查:4&lt; 5 =真;检查后:i = 5;
  • 第5次检查:5&lt; 5 =假;检查后:i = 6;打破循环;
while (num < 5) num++;
  • 第一次检查:1&lt; 5 =真;检查后:i = 2;
  • 第二次检查:2&lt; 5 =真;检查后:i = 3;
  • 第3次检查:3&lt; 5 =真;检查后:i = 4;
  • 第4次检查:4&lt; 5 =真;检查后:i = 5;
  • 第5次检查:5&lt; 5 =假;打破循环;

答案 3 :(得分:1)

由于while (num++ < 5);是一个表达式,其值为未增加的值numwhile (num < 5) num++;将以num++;增加1超过5结束

使用num时,语句 num只会运行到{{1}}为4:语句后{{1}}的值为{{1}}最后一次跑了将是5。

答案 4 :(得分:0)

原因是因为比较是在num的增量之前完成的。因此num等于5的步骤看起来像这样:

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

如果您使用了预增量,例如while(++num < 5);,那么num在循环结束时就会5

答案 5 :(得分:0)

因为while (num++ < 5);会首先将num与值进行比较,然后会增加它。例如,当num -> 5然后5 < 5为false时,循环将终止,但++将使num增加1

然而,在第二个示例ie while (num < 5)中,当num -> 5num++永远不会被调用时,循环将终止,因此num将是5而不是6。 / p>

答案 6 :(得分:0)

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); ,所以你的代码看起来像

to_date('to_date(''''2-2-2016'''',''''DD-MM-YYYY'''')', '<default nls_date_format mask>')

现在上述条件与

相同
<ebasp_date_of_joining>2-2-2016<ebasp_date_of_joining>

答案 7 :(得分:0)

在比较循环的最后一次运行中,num ++&lt; 5将首先进行比较,然后在断开循环之前将1添加到num。因此结果将比另一个循环高1。最后一次运行时,如果条件为假,则num将为5。在终止循环之前的那一点,它将加1,即num将变为6 ad然后中断。在另一个循环中,它不会进入循环,因此不会增加到6。

答案 8 :(得分:0)

在第一种情况下,System.out.println不在while循环体中。因为如果没有花括号,那么它将单个语句作为主体,意味着首先出现的分号是单个语句。在你的情况下,它是空语句

;         // is empty statement and valid

当那个时候num = 6的while循环出来并打印出

答案 9 :(得分:0)

以简单的陈述

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

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

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