Java Postfix增量运算符行为

时间:2013-10-25 18:25:58

标签: java operators

在下面的示例代码中,为什么每个方法后的结束值都不同。我希望两者都显示“i = 1”

public class Test {

    public int i = 0;    

    public static void main( String args[] ) {        
        Test t = new Test();
        t.test();
    }

    public void test() {

        i = 0;
        System.out.println( "[start a] i = " + i );
        doSomethingA( i++ );
        System.out.println( "[end   a] i = " + i );

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

        i = 0;
        System.out.println( "[start b] i = " + i );
        doSomethingB( i++ );
        System.out.println( "[end   b] i = " + i );

    }

    // Direct assignment of passed value
    public void doSomethingA( int x ) {
        i = x;
    }

    // Equation of passed value
    public void doSomethingB( int x ) {
        i += x;
    }

}

结果是:

[start a] i = 0
[end   a] i = 0
---------------------
[start b] i = 0
[end   b] i = 1

为什么我对方法中的'i'做了什么,在方法结束后它不应该增加1?

在这两种情况下,我都在方法中将'i'的值赋值为0。

由于

2 个答案:

答案 0 :(得分:1)

以下是从test调用两种方法时会发生的情况。

首先

i0开始,打印出0。评估i++。因为它是后增量,所以表达式值是旧值0,因此这是传递给doSomethingA的值。后增量在i处留下1doSomethingAx0)分配回i,因此会打印0

第二

i0开始,打印出0。评估i++。因为它是后增量,所以表达式值是旧值0,因此这是传递给doSomethingB的值。后增量在i处留下1doSomethingBx0)添加到i,因此i仍为1,并且会打印1

答案 1 :(得分:0)

添加

System.out.println("i=" + i + ", x=" + x); 

doSomethingAdoSomethingB方法的开头,你会看到两种情况

i=1, x=0

这是因为

method(i++);

i的第一个当前值传递给方法x = 0,然后将字段i递增(到1),然后执行方法体。所以当你在方法体内进行时

i = x;

您将i设为0

但如果你这样做

i += x;

您要将0添加到i的当前值1,而i不会更改{{1}}的值。