2

重複の可能性:
ポストインクリメント演算子java
「x = x ++」の後のxとは何ですか?

次の小さなプログラムのそれぞれの結果を誰かが私に説明できますか?:

public static void main(String[] args) {
    int a = 10;
    a = a++;
    System.out.println(a);
}

結果は次のとおりです。10

割り当て後にaを増やす必要があるので、なぜ11ではないのですか?それは、操作者の左右で異なる変数になるという事実=?

次のもの:

public static void main(String[] args) {
    int a = 10;
    a = ++a;
    System.out.println(a);
}

結果は次のとおりです。11

理解できますが、コンパイラは警告を表示します:「変数aへの割り当ては効果がありません」。しかし、結果は異議を唱えています。

アップデート:

元の質問は変更しませんが、警告の意味を理解できるように、このコメントを追加します。つまり、(単純なステートメント++ aによる)割り当てがなくても、結果は同じになります(11)。

4

7 に答える 7

11

の値はa++ですa++より優先度が高い=。そう:

  1. の値aが取られます。
  2. a増加します。
  3. (1)の値が に格納されaます。

したがって、 の値はa変わりません。

2番目のケースで何が起こるかを自分で理解できます。

于 2012-12-05T09:12:05.400 に答える
1

それぞれの方法で生成された Byte コードを分析してみましょう -

int a = 10;
a = a++;
System.out.println(a); //Output - 10 

生成された ByteCode -

0 bipush
2 istore_1
3 iload_1 
4 iinc      
7 istore_1
8 getstatic
11 iload_1
12 invokevirtual
15 return

int a = 10;
a = ++a;
System.out.println(a); //Output -11

ここでコンパイラは警告を出します -変数 a への代入は効果がありません

生成されたバイトコード -

0 bipush
2 istore_1
3 iinc
6 iload_1
7 istore_1
8 getstatic
11 iload_1
12 invokevirtual
15 return

ここでは、最初のケースで可変負荷が最初に発生し、次に増加することがわかりますvariable a

2番目のケースでは、最初にインクリメントしてから変数をロードするため、インクリメントの効果が得られます。

于 2012-12-05T09:52:52.103 に答える
1

最初のケースでは、割り当てが最初に行われ、次にインクリメントされます。したがって、インクリメント前の値が得られます。しかし、2 番目のケースでは、最初にインクリメントされてから割り当てられます。

于 2012-12-05T09:12:09.410 に答える
0

これは、a++ が実際の数値よりもメソッドに似ているために発生します。

それらを2つのseperat行に分割できます。

最初のものは

a = a;
return a + 1;

2番目のものは

a = a+1;
于 2012-12-05T09:12:17.850 に答える
0

a++variable の値を増やすことを意味しますaa++、元の値は a!

a = ??の値をaに設定することを意味します??

つまり、a の値を 1 ずつ増やしてから、古い値に設定しています。

++avariable の値を増やすことを意味しますa++a、新しい値は a!

したがって、2 番目の例では、a の値をインクリメントしてから、a の値をその値 (取得したばかり) に設定しているので、同じことを 2 回行っています。

于 2012-12-05T09:14:52.453 に答える
0

a++ と同等ですa = a + 1が、値が式で使用された後にインクリメントされます (ここでは代入)++aは同じですが、式で使用される前にインクリメントされます。a = ++a;に等しいため、明示的な割り当ての影響はありませんa = a = a + 1

于 2012-12-05T09:16:37.613 に答える
-2

あなたが書くとき、a++それは「=」演算子が処理された後に増加することを意味します。そう

b = a++;
System.out.println(a);
System.out.println(b);

あなたの画面上で生成する必要があります: 11, 10. ab が 'a' の値を取った後、11 になるためです。を に変更するa++++a、「=」が処理される前に強制的にインクリメントが発生するため、b = a + 1 が与えられ、画面には 11,11 が表示されます。

于 2012-12-05T09:13:09.550 に答える