この投稿のために混乱が生じました。著者が投稿を更新したところ、結果が明らかになりました。 結論: Java は式を左から右に評価します
閉まっている!
式の評価は右から左に行われるため、次のコードは に格納5
する必要がありj
ます。
int i=2;
int j=++i+i++;
System.out.println(j);
しかし、出力として6が得られるため、右から左への評価のアイデアを再考する必要があります。ここで理論を説明してください。
この投稿のために混乱が生じました。著者が投稿を更新したところ、結果が明らかになりました。 結論: Java は式を左から右に評価します
式の評価は右から左に行われるため、次のコードは に格納5
する必要がありj
ます。
int i=2;
int j=++i+i++;
System.out.println(j);
しかし、出力として6が得られるため、右から左への評価のアイデアを再考する必要があります。ここで理論を説明してください。
あなたの仮定は間違っています。ドキュメントの内容は次のとおりです。
代入演算子を除くすべての二項演算子は、左から右に評価されます
そう
++i+i++
と同等です
(++i)+(i++)
が++i
最初に評価されます。
これは与える
3+3
これは6
(そして i は4
この後に値を持ちます)。
次の理由により、6 が得られます3 + 3
。
++i
に (3 に)増加し、その値が使用されます。+i
また3を追加するものです++
は追加に参加しませんが、使用後に i をインクリメントしますint i = 2;
int j = ++i + i++;
と同じです
int i = 2;
// This part is from ++i
i = i + 1;
int left = i; // 3
// This part is from i++
int right = i; // 3
i = i + 1;
int j = left + right; // 3 + 3 = 6
代わりにあなたがした場合:
int i = 2;
int j = i++ + ++i;
これは次と同等です:
int i = 2;
// This part is from i++
int left = i; // 2
i = i + 1;
// This part is from ++i
i = i + 1;
int right = i; // 4
int j = left + right; // 2 + 4 = 6
したがって、合計は同じですが、合計される項は異なります。
最初の++
インクリメントは i です。は+
自分自身に i を追加します。私は3です。
Java と C# では、部分式の評価は左から右に行われます。
int j=++i + i++;
には、次の 2 つの部分式++i
とが含まれますi++
。これらの部分式はこの順序で評価されるため、次のように変換されます。
int j= 3 + 3;
Java や C# と同様に、++i
は実行されて戻りますが、 i は2 番目の の前に3
変更されます。2 番目は現在の値を返し、その後はの値になります。3
i++
i
3
i++
i
4
C++ では、これは未定義です。
そして実際には、このコードを入力したくないでしょう (コード ゴルフを除く)。
右から左だという考えはどこから得たのですか?左から右です。
単項演算子は二項演算子よりも優先されるため、次のように動作します。
int i=2;
int j =(++i)+(i++);
^^^ ^^^
3 +(i++) //The value of i is now 3.
^^^ ^^^
3 + 3 //The value of i is incremented after it is assigned.