1

この投稿のために混乱が生じました。著者が投稿を更新したところ、結果が明らかになりました。 結論: Java は式を左から右に評価します

閉まっている!

式の評価は右から左に行われるため、次のコードは に格納5する必要がありjます。

int i=2;
int j=++i+i++;
System.out.println(j);

しかし、出力として6が得られるため、右から左への評価のアイデアを再考する必要があります。ここで理論を説明してください。

4

8 に答える 8

7

あなたの仮定は間違っています。ドキュメントの内容は次のとおりです。

代入演算子を除くすべての二項演算子は、左から右に評価されます

そう

++i+i++

と同等です

(++i)+(i++)

++i最初に評価されます。

これは与える

3+3

これは6(そして i は4この後に値を持ちます)。

于 2013-05-03T16:03:59.427 に答える
7

次の理由により、6 が得られます3 + 3

  • 最初の OP は、最初++iに (3 に)増加し、その値が使用されます。
  • 次のOPは+iまた3を追加するものです
  • 最後の OP++は追加に参加しませんが、使用後に i をインクリメントします
于 2013-05-03T16:02:56.843 に答える
3
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

したがって、合計は同じですが、合計される項は異なります。

于 2013-05-03T16:10:12.010 に答える
3

最初の++インクリメントは i です。は+自分自身に i を追加します。私は3です。

于 2013-05-03T16:03:21.970 に答える
1

Java と C# では、部分式の評価は左から右に行われます。

int j=++i + i++;

には、次の 2 つの部分式++iとが含まれますi++。これらの部分式はこの順序で評価されるため、次のように変換されます。

int j= 3 + 3;

Java や C# と同様に、++iは実行されて戻りますが、 i は2 番目の の前に3変更されます。2 番目は現在の値を返し、その後はの値になります。3i++i3i++i4

C++ では、これは未定義です。

そして実際には、このコードを入力したくないでしょう (コード ゴルフを除く)。

于 2013-05-03T16:04:02.897 に答える
1

右から左だという考えはどこから得たのですか?左から右です。

Javaでの評価順序の規則は何ですか?

于 2013-05-03T16:03:36.800 に答える
1

単項演算子は二項演算子よりも優先されるため、次のように動作します。

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.
于 2013-05-03T16:03:49.240 に答える