0

以下のサンプル コードでは、各メソッドの終了値が異なるのはなぜですか。どちらも「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 に割り当てています。

ありがとう

4

2 に答える 2

1

から両方のメソッドを呼び出すと、次のようになりますtest

初め。

iで始まり00印刷されます。 i++評価されます。後置インクリメントであるため、式の値は古い値であり0、それが に渡されdoSomethingAます。ポストインクリメントはiで終了し1ます。 ( ) を に戻すためdoSomethingA、出力されます。x0i0

2番。

iで始まり00印刷されます。 i++評価されます。後置インクリメントであるため、式の値は古い値であり0、それが に渡されdoSomethingBます。ポストインクリメントはiで終了し1ます。 に( ) をdoSomethingB追加するので、 のままで、印刷されます。x0ii11

于 2013-10-25T18:30:48.890 に答える
0

追加

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

doSomethingAとメソッドの開始時にdoSomethingB、両方のケースでそれがわかります

i=1, x=0

これは

method(i++);

の最初の現在の値がiメソッド Making に渡されx = 0、次にフィールドiがインクリメントされ (に1)、メソッドの本体が実行されます。したがって、メソッド本体内で行う場合

i = x;

あなたが設定iしている0

しかし、もしそうなら

i += x;

の値を変更しない0の現在の値に追加しています。 i1i

于 2013-10-25T18:37:43.980 に答える