8

このコードスニペットを検討してください

int j = 7;
System.out.println(Integer.toBinaryString(j));
j = ~j++;
System.out.println(Integer.toBinaryString(j));

版画

111
11111111111111111111111111111000

私が見たいと思っているもの

111
11111111111111111111111111111001

最初は〜と++の優先順位かもしれないと思った

~ が ++ の前に評価される場合、答えは

11111111111111111111111111111001

そうでなければ、++ が ~ の前に評価される場合

11111111111111111111111111110111

Oracle のチュートリアルを検索しましたが、答えが見つかりませんでした。誰でもこの動作を説明できますか?

4

5 に答える 5

7

'++' 後置インクリメント演算子は、インクリメントが発生する前の j の値を返すことを忘れないでください。つまり、'j' が 7 の場合、'j++' は j を 8 に設定しますが、 7 を返します。~7 は、3 つの 0 ビットで終わる数値です。

'++' 後置インクリメント演算子は、いわゆる「L 値」に対してのみ操作できます。L 値は、コードが論理的に参照できる場所 (変数、配列要素、パラメーター、またはクラス フィールド) に実際に存在する値です。L 値の値を取得し、それに数値演算を適用するとすぐに、R 値が得られます。R 値は単なる値であり、結果を格納できる永続的なストレージを参照するものではありません。L 値には代入できますが、R 値には代入できません。そのため、R 値を「++」しようとすると、コンパイル エラーが発生します。

'~' 演算子が最初に実行された場合、(~j)++ のように R 値を ++ することになります。これはコンパイルされません。コードがコンパイルされるという事実は、優先順位が逆であることを意味します: ~(j++)。

このような括弧は、混乱が生じたときにいつでも優先順位を整理できる、私が知っている最も簡単な方法です: 3 つのテスト ケースを書くだけです:

  1. あなたが確信していない元の方法。
  2. 括弧を使用すると、1 つの操作順序が強制されます。
  3. 括弧を使用すると、操作の他の順序が強制されます。

それを実行して、#2 または #3 が #1 と同じ結果を生成するかどうかを確認します。:-)

于 2013-05-10T15:10:37.600 に答える
1

単項演算子 ( ++1--+-~!) は、右から左に評価されます。したがって++は の前に評価され~ます。

于 2013-05-10T15:19:01.203 に答える