2013-05-10 11 views
7

は、私はそれがかもしれないと思った、このコードスニペットに〜の優先順位と++ Javaの

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

プリント私が最初

111 
11111111111111111111111111111001 

を見ることを期待しています何

111 
11111111111111111111111111111000 

を考えます〜と++の優先順位

if t ++は私がOracle tutorialsを検索〜

11111111111111111111111111110111 

前に評価されている場合、彼は〜答えは他の

11111111111111111111111111111001 

なり++ 前に評価されたが、私は答えを見つけることができませんでした。 誰もこの動作を説明できますか?

+3

誰もこの方法でコードを書くべきではありません。 – duffymo

+0

'j =〜(++ j)'を試してみましたか? – BlackVegetable

+2

Hm ...これはJavaで定義された動作ですか?あなたは割り当ての両側でjを変更しています。私はあなたが 'j = j ++'を試しても、予期しない結果を得るかもしれないと思います。だからこれは本当に優先順位の問題ではありません。 – Axel

答えて

6

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

ポストインクリメント演算子 '++'は、いわゆる "L値"でしか操作できません。 L値は、コードが論理的に参照できる場所、つまり変数、配列要素、パラメータ、クラスフィールドのいずれかに実際に存在する値です。 L値の値を取って数値演算を行うとすぐにR値が得られます。 R値はであり、値はであり、結果を格納できる永続ストレージは参照しません。 L値に割り当てることはできますが、R値には割り当てることはできません。したがって、R値を '++'にしようとすると、コンパイルエラーが発生します。

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

  1. あなたがよくわからいるオリジナルの方法:ちょうど3つのテストケースを書く:このような

    括弧は、私は混乱があるたびに、あなたが優先して並べ替えることができることを知っている最も簡単な方法です。

  2. 括弧は1つの操作を強制します。
  3. 括弧は他の操作の順序を強制します。

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

+0

は、j =(〜j)++はコンパイルエラーを返します 〜++は優先順位が高いため、〜j ++と同等です。 –

+1

+1非常に良い答え、特にr値/ l値の言及。 – Dukeling

0

まず、しないでください。そのような演算子を1つのステートメントにまとめる理由はありませんが、実際にこれをライブコードに入れようと計画しておらず、実験していただけです。 Javaオペレータの優先順位については、このページをお試しください。http://bmanolov.free.fr/javaoperators.php

+0

答えが 最初に増えます。00 ..... 01000 then complement:11 ..... 10111 –

+0

リンクから必要な情報を実際に抽出し、説明とともに解答に投稿しない限り、これはコメントであったはずです。 – Dukeling

+0

リンクに気付かなかったものがあるかどうかを教えてください ++よりも優先度が高い(前置増数または後置増分)が〜より優先度が高く、両方とも正しくありますAssociativity –

1

コードは非常に脆弱です。私は、 "〜i ++"という表現が評価されると "〜i"という値が抽出され、 "i ++"が実行され、最後に "i ++"の前の値を上書きするという割り当てが行われると思います。

+2

〜8が11111111111111111111111111111000ではなく11111111111111111111111111110111です。 編集:あなたの編集が表示されます:-)しかし、あなたは依然として逆順になります。 ++が最初に起こりますが、++の結果は7ではありません。 –

+0

-8と簡単に混同します。私はしばらく混乱していて、この答えが正しいと思った。 – BlackVegetable

+0

最初は混乱しました。答えを出す前にもう少し考えなければならない。 – ctn

1

両方の演算子は右結合2次演算子ですが、簡単なテストでは最初に実行されたのは++で、後者はBITWISE NOT演算です。

int j = 7, z = 7, k = 7; 
z = z++; 
z = ~z; 
k = ~k++; 
j = ~j; 
j++; 
System.out.println(Integer.toBinaryString(z)); 
// 11111111111111111111111111111000 
System.out.println(Integer.toBinaryString(j)); 
// 11111111111111111111111111111001 
System.out.println(Integer.toBinaryString(k)); 
// 11111111111111111111111111111000 
1

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

関連する問題