Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 这里发生了什么:sum+;=i++;;?_Java_Logic_Increment_Postfix Operator - Fatal编程技术网

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。答案中的语法解释会有所帮助这很重要。