Java 这里发生了什么:sum+;=i++;;?
我有一段简单的代码,但我不理解这部分:Java 这里发生了什么:sum+;=i++;;?,java,logic,increment,postfix-operator,Java,Logic,Increment,Postfix Operator,我有一段简单的代码,但我不理解这部分: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); 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);
int num1=5;
整数和=0;
如果(num1<100){
对于(int i=0;i
我得到的结果是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);
int num1=5;
整数和=0;
如果(num1<100){
对于每一轮中的(int i=0;ii
在新的循环轮之前(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
.
.
.
执行语句之前的| num1 | sum | i | i++|值,结果在下一行
|| | | | num1=5
|5 | | | |和=0
|5 | 0 | | | if(num1<100)//真,执行if块
|5 | 0 | | | for(int i=0;
|5 | 0 | 0 | | for(……;i
(调试器的启动可能有点复杂,但它是理解程序在做什么的好方法,而且对于调试代码来说几乎是必不可少的)那为什么我会得到6分呢?谢谢你,我想补充一点,那就是++的位置很重要。例如,如果你有++i,这意味着我在读取它之前增加了1分,而i++意味着我的值在增加1分之前被读取。这看起来很适合使用调试器,一行一行地逐行检查代码d逐步查看每个变量的值是如何变化的。您甚至可以按照此处答案提供的演练进行操作。@andrewjames虽然这可能会让您对不断变化的值有一些了解,但它无法解释为什么值会以这种方式变化。是的,我同意,@TiMauzi。答案中的语法解释会有所帮助这很重要。