2011-09-13 18 views
3

複合代入演算子とJavaの代入演算子を理解するのに問題があります。誰かが私にどのようにこれらの2つの演算子作品を説明することはできますか? (私は、一時変数を使用して作業を説明する本当に良いサンプルコードを見つけましたが、悲しいことに私はそれを失ってしまいました)。すべてのケースでは、割り当てはが右側に発生する可能性があり任意の増分を上書きkにすることをJavaコンパウンド代入演算子と代入演算子

 int k = 12; 
     k += k++; 
     System.out.println(k); // 24 -- why not (12+12)++ == 25? 

     k = 12; 
     k += ++k; 
     System.out.println(k); // 25 -- why not (1+12)+(1+12) == 26?    

     k = 12; 
     k = k + k++; 
     System.out.println(k); // 24 -- why not 25? (12+12)++? 

     k = 12; 
     k = k++ + k; 
     System.out.println(k); // 25 -- why not 24 like the previous one? 

     k = 12; 
     k = k + ++k; 
     System.out.println(k); // 25 -- OK 12+(1+12) 

     k = 12; 
     k = ++k + k; 
     System.out.println(k); // 26 -- why? 
+0

ロジックの基礎は、++ kはメイン操作の前に実行され、k ++ではメイン操作が最初に実行されます。 –

答えて

6

注:ここでは彼らのために私の小さなサンプルコード(私はすでに接頭辞と接尾事業者との違いを知っている)があります。イン・ライン

置くコメント:

int k = 12; 
    k += k++; 
    System.out.println(k); // 24 

k++は、あなたが値を使用しました後にインクリメントを意味し、これはk = 12 + 12

k = 12; 
    k += ++k; 
    System.out.println(k); // 25 

++kコーディングと同じである前に、増分を意味し、あなたは値を使用するので、これはコード化と同じですk = 12 + 13

k = 12; 
    k = k + k++; 
    System.out.println(k); // 24 

k++は、あなたが値を使用しました後にインクリメントを意味し、これはk = 12 + 12

k = 12; 
    k = k++ + k; 
    System.out.println(k); // 25 

k++コーディングと同じであるあなたが値を使用しました後にインクリメントを意味するので、これは符号化と同じk = 12 + 13

k = 12; 
    k = k + ++k; 
    System.out.println(k); // 25 

++kは、あなたが値を使用前に、増分を意味し、これはk = 12 + 13

k = 12; 
    k = ++k + k; 
    System.out.println(k); // 26 

++kは、あなたが再び使用されている値を、使用前に増分を意味コーディングと同じであるので、これはコーディングと同じですk = 13 + 13

+0

** + 1 ** - ダーン、私にそれを打つ! – Eric

+0

第4の例では、 'k = k ++ + k'は' k = 12 + 13'と同等でなければなりません。 – chesles

+0

申し訳ありません - あなたは正しいです(今修正しました)。あまりにも多くのコピー貼り付けが進行中:( – Bohemian

0

ここから少し完了: http://www.coderanch.com/how-to/java/PostIncrementOperatorAndAssignment

はのは、ラインは「私=私は++;」何をよく見てみましょう

"i ++"が評価されます。 "i ++"の値は、増分が発生する前のiの値です。 "i ++"の評価の一部として、iは1だけインクリメントされます。今私は1の値を持っています。 割り当てが実行されます。つまり、0 それは、おおよそ言い換えると

int oldValue = i; 
i = i + 1; 
i = oldValue; 

に変換「私は= iは++」、である - 私は、インクリメント前iの値である「私は++」の値を割り当てられています増分が最後に起こっているという誤解が一般的です。インクリメントは、式が評価されるとすぐに実行され、インクリメント前の値は、同じステートメント内での将来の使用のために記憶されます。ここ

1

は、最初のケースの詳細な説明である:

int k = 12; k += k++; System.out.println(k);

k += k++;は、と等価である: k = k + (k++);

k + (k++);左から右に評価されます。
最初のkは12の値を有する。 k++はkの元の値(すなわち12)と評価される。 kは後で増分される。

他の投稿は、他のケースを説明してくれます。


しかし、ここで左から右と右のポストインクリメントに評価を示す興味深いケースされています

int k = 12; k = k + k++ + k; System.out.println(k);

k + (k++) + k;は左から右に評価されます。
第1のkは12の値を有する。
第2のk:k++はkの元の値(すなわち12)と評価される。 kは後で増分される。
第3のk:今、kは、第2のkの後に来るので、13の増分値を有する。
合計結果は37(つまり、12 + 12 + 13)です。