このコードの出力は次のとおりです。
c: 1 , id: 0
出力がそうでない理由を知りたい:
c: 0 , id: 1
class A {
private static long c;
private final long id = c++;
public A() {
print("c: " + c + " , id: " + id);
}
}
式 like は次のようにc++
動作するためです。
c
; これを覚えておいてください(例tmp = c
;)c
tmp
)したがって、この場合、 から開始するc = 0
ため、id
は 0 になります... しかしc
、プロセスでインクリメントされるためc
、式が評価された後は 1 になります。
詳細については、Java 言語仕様のセクション 15.14.2を参照してください。エキス:
実行時に、オペランド式の評価が突然完了すると、同じ理由で後置インクリメント式が突然完了し、インクリメントは発生しません。それ以外の場合は、値 1 が変数の値に追加され、合計が変数に格納されます。加算の前に、値 1 と変数の値に対してバイナリ数値昇格 (§5.6.2) が実行されます。必要に応じて、合計は縮小プリミティブ変換 (§5.1.3) によって縮小されるか、格納される前に変数の型へのボックス化変換 (§5.1.7) を受けます。後置インクリメント式の値は、新しい値が格納される前の変数の値です。
id = c++
の値をc
に代入し、id
インクリメントします。これは、次のことを行ったかのようです。c
c = 0;
id = c; // assigns zero
c = c + 1;
id = ++c
代わりに試してください。
あなたはC++を使っているからです。
c++ は、最初に変数を ID に保存してから ++ をインクリメントすることを意味します。
++c を使用する場合は、最初にインクリメントしてから id に保存します。
ただし、c++ は c = c+1 を意味するため、c:1 id:1 が返されます。
id = c+1 と言うと、c:0 と id:1 が得られます。