11

Java の公式チュートリアルから、接頭辞と後置 ++ の優先順位が異なることを読みました。

接尾辞: expr++ expr--

単項: ++expr --expr +expr -expr ~ !

オペレーター

チュートリアルによると、これはすべきではありません

d = 1; System.out.println(d++ + ++d);

4 の代わりに6 ( d++d を 2 にして 3 にする) を出力しますか?++d

++d事前に評価されるという説明は知っていますが、d++優先順位が高い場合++d、なぜd++最初に評価されないのですか? さらに、どのような場合にd++優先度が高いことを示す必要がありますか?

編集:

私は次のことを試しました:

d = 1; System.out.println(++d * d++);

4 を返します。1*3 ではなく 2*2 のようです。

4

9 に答える 9

16

println文の中はこの演算 (d++) + (++d)

  1. 次のように、d の値が読み取られます (d = 1)
  2. d (1) の現在の値が加算関数に入れられます
  3. d の値がインクリメントされます (d = 2)。

  4. 次に、右側で d の値が読み取られます (2)

  5. d の値がインクリメントされます (現在は d = 3)
  6. 最後に、d (3) の値が加算関数に入れられます。

    したがって、1 + 3 は 4 になります

編集:フォーマットについては申し訳ありませんが、私はリストの使用がかなり苦手です(笑)

于 2011-06-16T15:02:27.353 に答える
12

キーは、操作から返されるものです。

  • x++ は x の値を変更しますが、古い x を返します。
  • ++x は x の値を変更し、新しい値を返します。
d=1
System.out.println(d++ + ++d); // d は 1 です
System.out.println(1 + ++d); // d は 2
System.out.println(1 + 3); // d は 3

プリント 4

于 2011-06-16T15:03:33.247 に答える
8

優先順位が異なるからといって、最初に評価されるわけではありません。

これは、式がこのようにグループ化されることを意味します。

この場合、d++ + ++dはグループ化(d++) + (++d)され、このバイナリ式は次の順序で評価されます。

  • 左オペランドd++。この部分式は、接尾辞のインクリメント演算子と変数で構成されているため、次の2つの効果があります。
    • 部分式の値は1
    • 変数が更新されます:d = 2
  • 右オペランド++d。この部分式は、プレフィックスインクリメント演算子と変数で構成されているため、次の2つの効果があります。
    • 変数が更新されます:d = 3
    • 部分式の値は3
  • 演算子+は、2つのオペランドの値を使用して評価されます。
    • したがって、式の値は1 + 3=4です。

の接頭辞と接尾辞の形式の異なる優先順位は、で++のみ表示され++d++ます。これは-として解釈されます。これは、値ではなく変数でのみ機能するため、++(d++)意味がありません(誰もありません)(結果は価値)。(++d)++++

于 2011-06-16T15:08:01.560 に答える
2

ここで、この Java 演算子の優先順位が無視されるのはなぜですか?を参照してください。.

要約すると、後置演算子が最初に評価されますが、設計どおりに変数の元の値が返されます。だから、あなたの操作の目的のために:

(d++ + ++d)

Processes as:
1. d++ evaluates, returning the original value of 1 but incrementing d to 2
2. ++d evaluates, incrementing the value of 2 TO 3, and returning 3
3. +   evaluates, resulting in 1 + 3

混乱は、評価されるトークンの優先順位ではありません。そのとおりです。本当の問題は、後置演算子と前置演算子の機能上の違いを理解することです。

于 2011-06-16T15:07:21.100 に答える
2

これは優先順位ではなく、評価順序に関するものです。 d++に評価されます1が、その後dインクリメントされます。 ++dをインクリメントdし、3 に評価されます。

于 2011-06-16T15:03:45.897 に答える
0

System.out.println(d++ + ++d);

手順は次のとおりです。

++d が実行されるため、d は 2 になります。

d + d が実行され、これは 4 に等しくなります。

値 4 が System.out.println() に渡されます

d++ が実行されるので、d は 3 になります。

于 2011-06-16T15:05:52.397 に答える
0

私は上からすべての説明を調べました..理解によると、次のコードは 11.0 を与える必要があり、y は 10.0 double x = 4.5; を与えます。x = x + ++x; // x は値 10.0 を取得します。

于 2013-09-29T15:19:34.127 に答える
0

d の値は 1 です

d++ が評価されます。その値は 1 で、d は現在 2 です (post++ はインクリメント前に値を返します)

++d が評価されます。その値は 3 で、d は現在 3 です (++pre はインクリメント後に値を返します)

1 + 3 = 4

于 2011-06-16T15:04:30.463 に答える
-1

他のコメントに加えて、シーケンスポイントを確認することをお勧めします。これは、このようなもののいくつかが未定義の動作につながる可能性があるためです.ただし、あなたのケースはJava用に定義されていると思います.

何をしx[i]=i++ + 1;ますか?

http://www.angelikalanger.com/Articles/VSJ/SequencePoints/SequencePoints.html

于 2011-06-16T15:06:51.540 に答える