这里发生了什么:sum+=i++



我有一段简单的代码,但我不理解这部分:sum += i++

int num1 = 5;
int sum = 0;

if (num1 < 100) {
for (int i = 0; i < num1; i++)
sum += i++; //?
System.out.println("sum = " + sum);
} else {
sum = -1;
}
System.out.print(sum);  

我得到的结果是6,我不明白是怎么回事,为什么。

sum += i++等效于sum = sum + i; i = i + 1


这将您的代码翻译为:

int num1 = 5;
int sum = 0;

if (num1 < 100) {
for (int i = 0; i < num1; i++) //<-- i is incremented
sum = sum + i; //<-- sum gets incremented by i here
i = i + 1; //<-- i is incremented again, increment/loop-cycle ratio = 2
System.out.println("sum = " + sum);
} else {
sum = -1;
}
System.out.print(sum);  

CCD_ 4在每个循环周期增加2并且CCD_ 5在每个循环循环周期增加CCD_。


结果为6,因为:

开始循环时,i为0,sum为0。

在第一个循环周期中,sum递增0,i递增2(2(。

在第二个循环周期中,sum增加2(2(,i增加2(4(。

在第三个循环周期中,sum增加4(6(,i增加2(6(。

此时,i不再满足num1为5的条件i < num1,并结束循环。

在每一轮中,变量i在新的循环循环(循环头中的i++(之前递增,并且在行sum += i++;之后递增。

这导致i每次都是连续的0, 2, 4,所提到的行被调用。在i=4i被循环递增之后,循环停止。因此,sum=0+2+4=6就是您的输出。

这种行为是意料之中的,因为后缀递增,i++中的运算符在变量之后的。这意味着isum的定义之后递增。如果您类似地尝试前缀符号++i,您应该会得到不同的结果。

循环执行3次,第一次i=0,然后sum不递增,因为i++是后递增,请注意,i在每次迭代中递增两次。

第二次迭代i=2,第三次迭代i=4

sum=0+2+4=6

使用纸张编写如下表,使用调试器和/或为代码添加更多打印。

| num1 | sum |  i  | i++ | values before statement is executed, result on next line 
|      |     |     |     | num1 = 5
|   5  |     |     |     | sum = 0
|   5  |  0  |     |     | if (num1 < 100)  // true, exxecute if block
|   5  |  0  |     |     | for (int i = 0;
|   5  |  0  |  0  |     | for (.........; i < num1;  // true, iterate
|   5  |  0  |  0  |     |    ...... i++ // i is increment, old value summed
|   5  |  0  |  1  |  0  |    sum += " (0)
|   5  |  0  |  1  |     | for (.........; ........; i++)
|   5  |  0  |  2  |  1  | for (.........; i < num1;  // true, iterate
|   5  |  0  |  2  |     |   ...... i++ // i is increment, old value summed|
|   5  |  0  |  3  |  2  |   sum += " (2)
|   5  |  2  |  3  |     | // and so on
.
.
.

(调试器的启动可能有点复杂,但它是了解程序正在做什么的好方法,对于调试代码几乎是必不可少的(

最新更新