2012-05-08 19 views
1

このコードの出力は次のとおりです。ポストインクリメント演算子変数

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

'C++' 'C '(ポストインクリメント)をインクリメントだろう、とあなたはポストインクリメントを言っているので、' id'はなるだろう、ID = C + 1、あなたがCを取得します増分する前の 'c'の値。 – birryree

答えて

4

c++のような式は次のように動作するので:

  • cを評価。この(例えばtmp = c;)覚えて
  • インクリメントc
  • 式の結果は、元の値である

tmp)だからこのケースでは、あなたはとてもidが0になると、c = 0から始め..しかし、cがプロセスでインクリメントされるため、式が評価された後にはcが1になります。

詳細については、Java言語仕様のsection 15.14.2を参照してください。展開時:

オペランド式の評価が突然完了すると、同じ理由で後置インクリメント式が突然完了し、インクリメントが発生しません。それ以外の場合は、値1が変数の値に加算され、合計が変数に戻されます。加算の前に、値1と変数の値に対してバイナリ数値昇格(5.6.2)が実行されます。必要であれば、その総和は、縮小プリミティブ変換(5.1.3)によって縮小され、かつ/またはボクシング変換(5.1.7)の後に変数の型に格納される。後置インクリメント式の値は、新しい値が格納される前の変数の値です。

1

id = c++が割り当てられますc~id,、次にの値cをインクリメントします。次のようになっています:

c = 0; 
id = c; // assigns zero 
c = c + 1; 

代わりにid = ++cを試してください。

1

C++を使用しているためです。

C++は、まず変数をIDに保存してから++をインクリメントすることを意味します。

++ cを使用する場合は、まずインクリメントしてidに保存します。

しかし、C++はc = c + 1を意味するため、c:1 id:1を返します!

あなたが言う場合:0とID:1