Java:增量/减量运算符的前缀/后缀?

O_O*_*O_O 29 java pre-increment post-increment

从下面或这里的程序,为什么最后一次调用System.out.println(i)打印值7

class PrePostDemo {
     public static void main(String[] args){
          int i = 3;
          i++;
          System.out.println(i);    // "4"
          ++i;             
          System.out.println(i);    // "5"
          System.out.println(++i);  // "6"
          System.out.println(i++);  // "6"
          System.out.println(i);    // "7"
     }
}
Run Code Online (Sandbox Code Playgroud)

Spi*_*idy 63

i = 5;
System.out.println(++i); //6
Run Code Online (Sandbox Code Playgroud)

这打印出"6",因为它需要我添加一个并返回值.5 + 1 = 6; 这是前缀,在操作中使用前添加数字.

i = 6;
System.out.println(i++); //6 (i = 7, prints 6)
Run Code Online (Sandbox Code Playgroud)

这打印出"6",因为它需要i,存储副本,添加1并返回副本.所以你得到了我的价值,但也同时增加了它.因此,您打印出旧值但它会增加.后缀增量的美妙.

然后当你打印出i时,它会显示i的真实值,因为它已经增加了.7

  • 这里的所有其他答案都说首先使用"i"的值,然后它会增加,但正如你所说的那样,正确的值会增加,然后返回旧值的COPY.当我们以i = 5为例时我们理解更多; i = i ++; 如果该值首先分配并递增,则i将为6但在这种情况下为5 (3认同)

Yve*_*omb 14

我知道这已得到回答,但认为另一种解释可能会有所帮助.

另一种说明方式是:

++i将给出结果new i,i++将给出原始结果i并存储new i下一个动作.

想到它的一种方法是,在表达式中做其他事情.当您打印当前值时i,它将取决于i表达式内或表达式后是否已更改.

    int i = 1;
result i = ++i * 2 // result = 4, i = 2
Run Code Online (Sandbox Code Playgroud)

i在计算结果之前评估(更改).打印i此表达式,显示已用于此表达式的已更改值i.

result i = i++ * 2 // result = 2, i = 2
Run Code Online (Sandbox Code Playgroud)

i在计算结果后评估.因此i,从此表达式打印将显示此表达式中i使用的原始值,但i仍会更改以用于任何进一步的用途.因此i,在表达式之后立即打印值将显示新的递增值i.随着价值的i变化,无论是印刷还是使用.

result i = i++ * 2 // result = 2, i = 2
System.out.println(i); // 2
Run Code Online (Sandbox Code Playgroud)

如果您保持一致的模式并包含所有值的打印行:

  int i = 3; 
System.out.println(i);    //  3
System.out.println(i++);  //  3
System.out.println(i);    // "4"
System.out.println(++i);  //  5          
System.out.println(i);    // "5"
System.out.println(++i);  // "6"
System.out.println(i++);  // "6"
System.out.println(i);    // "7"
Run Code Online (Sandbox Code Playgroud)


Dil*_*ruk 5

认为++ii++相似,i = i+1.但事实并非如此。区别在于何时i获得新的增量。

在中++i,增量会立即发生。

但是如果有的话,i++当程序转到下一行时会增加。

在这里看代码。

int i = 0;
while(i < 10){
   System.out.println(i);
   i = increment(i);
}

private int increment(i){
   return i++;
}
Run Code Online (Sandbox Code Playgroud)

这将导致无止境的循环。因为i将返回原始值,并且在分号之后我将递增,但返回值尚未返回。因此,i将永远不会实际以增量值返回。