我有一段简单的代码,但我不理解这部分: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=4
和i
被循环递增之后,循环停止。因此,sum=0+2+4=6
就是您的输出。
这种行为是意料之中的,因为后缀递增,i++
中的运算符在变量之后的。这意味着i
在sum
的定义之后递增。如果您类似地尝试前缀符号++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
.
.
.
(调试器的启动可能有点复杂,但它是了解程序正在做什么的好方法,对于调试代码几乎是必不可少的(