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

时间:2011-03-24 01:05:51

标签: java post-increment pre-increment

通过以下程序或here,为什么最后一次调用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"
     }
}

11 个答案:

答案 0 :(得分:63)

i = 5;
System.out.println(++i); //6

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

i = 6;
System.out.println(i++); //6 (i = 7, prints 6)

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

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

答案 1 :(得分:14)

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

另一种说明方式是:

++i会提供new i的结果,i++会提供原始i的结果,并存储new i以进行下一步操作。

一种思考方式,就是在表达式中做其他事情。当您打印当前值i时,它将取决于表达式内或表达式后i是否已更改。

    int i = 1;
result i = ++i * 2 // result = 4, i = 2
在计算结果之前评估(更改)

i。打印此表达式的i,显示用于此表达式的i的更改值。

result i = i++ * 2 // result = 2, i = 2
在计算结果后评估

i。因此,从此表达式中打印i会提供此表达式中使用的i的原始值,但i仍会更改以供进一步使用。因此,在表达式之后立即打印i的值将显示新的递增值i。随着i的值发生变化,无论是打印还是使用。

result i = i++ * 2 // result = 2, i = 2
System.out.println(i); // 2

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

  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"

答案 2 :(得分:4)

++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++;
}

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

答案 3 :(得分:2)

System.out.println(i++);  // "6"

这将println发送到此代码行之前的值(6),然后递增I(到7)。

答案 4 :(得分:2)

为什么变量没有更新?

  • Postfix:将i的当前值传递给函数,然后递增它。
  • 前缀:递增当前值,然后将其传递给函数。

你对我没有做任何事情的行没有任何区别。

请注意,分配也是如此:

i = 0;
test = ++i;  // 1
test2 = i++; // 1

答案 5 :(得分:1)

它为上一个语句中的最后一个语句cos打印 7 ,它的值为 6 ,并且当它增加到7时最后一个声明被打印

答案 6 :(得分:0)

从临时变量的角度考虑它。

i =3 ;
i ++ ; // is equivalent to:   temp = i++; and so , temp = 3 and then "i" will increment and become     i = 4;
System.out.println(i); // will print 4

现在,

i=3;
System.out.println(i++);

相当于

temp = i++;  // temp will assume value of current "i", after which "i" will increment and become i= 4
System.out.println(temp); //we're printing temp and not "i"

答案 7 :(得分:0)

也许您可以通过此示例了解更好的前缀/后缀。

public class TestPrefixPostFix 
{
    public static void main (String[] args)
    { 
        int x=10;
        System.out.println( (x++ % 2 == 0)?"yes "+ x: " no "+x);
        x=10;
        System.out.println( (++x % 2 == 0)?"yes "+ x: " no "+x);
    }
}    

答案 8 :(得分:0)

这是我的答案。你们中的一些人可能会觉得很容易理解。

package package02;

public class C11PostfixAndPrefix {

    public static void main(String[] args) {
        // In this program, we will use the value of x for understanding prefix 
        // and the value of y for understaning postfix. 
        // Let's see how it works. 

        int x = 5; 
        int y = 5; 

        Line 13:   System.out.println(++x);  // 6   This is prefixing. 1 is added before x is used. 
        Line 14:   System.out.println(y++);  // 5   This is postfixing. y is used first and 1 is added. 

        System.out.println("---------- just for differentiating");

        System.out.println(x);  // 6   In prefixing, the value is same as before {See line 13}
        System.out.println(y);  // 6   In postfixing, the value increases by 1  {See line 14} 

        // Conclusion: In prefixing (++x), the value of x gets increased first and the used 
        // in an operation. While, in postfixing (y++), the value is used first and changed by
        // adding the number. 
    }
}

答案 9 :(得分:0)

我知道这是一个非常老的问题,但我没有列出此类答案。看一个如何实现实际运算符的示例对我有帮助,也许对其他人有帮助

class Integer {
  private int __i;

  function Integer ++() { // prefix operator i.e. ++x
    __i+=1; //increment
    return this; //return object with incremented value
  }

  function Integer ++(Integer x) { //postfix operator i.e. x++
    __i+=1; //increment
    return x; //return original object
  }
}

答案 10 :(得分:0)

这可能会有所帮助..我也需要理解这个谜题..

公共类主{ public static void main(String[] args) {

int x = 5;
int y=5;

System.out.println(++x);
System.out.println(y++);

System.out.println("------");

System.out.println(x);
System.out.println(y);

} }