0

数週間前に同様の質問を設定しましたが、 Java演算子の優先順位に関するあいまいさと混乱を解消することはできません。今回はこのコードの断片があります:

int mask = 0;
int count = 0;
if( ((5<7) || (++count < 10)) | mask++ < 10 )   
    mask = mask + 1;
System.out.println(mask + " " + count);

結果は(私には予期せず):20です。

さらに、コンパイラーは、式(++ count <10)のみに下線を引く警告を提供します:デッドコード。

ただし、次のいずれかの方法でコードを実行すると思います。

1)| ||よりも優先順位が高いため、式の前後に括弧があったと見なされます((++ count <10)| mask ++ <10)。このようにして、コンパイラは両方の部分を実行し、カウントは1(++ count <10)に設定されている必要があります。

2)コンパイラが最初に(5 <7)を調べ、falseと評価した後、2番目の式全体をスキップする場合、マスクは増加されていないはずであり、出力で値1を待機します。

何を誤解していて、コンパイラの動作や出力を説明できませんか?

4

2 に答える 2

4

||は、OR左側の式がfalseの場合にのみ右側の式を評価する演算子です。あなたの場合、5 < 7は真であり++count < 10、評価されません。

一方、|常に両方の式を評価し((5<7) || (++count < 10))ます。trueであっても、mask++ < 10評価されます。

于 2013-02-04T10:20:36.520 に答える
0

| ||よりも優先順位が高いため、式の前後に括弧があったと見なされます((++ count <10)| mask ++ <10)。

コードにはそのような式はありません。もう一度見てください。全体の式は( ((5<7) || (++count < 10)) | mask++ < 10 )です。は||、定数テスト5<7++count < 10に関連付けます。これは、定数テストが常にfalseであるため実行できず、|すべてをに関連付けますmask++ < 10

実際、ここでは演算子の優先順位の問題はまったくありません。括弧をどこに置いたかについてのあなた自身の誤解だけです。

于 2013-02-04T23:37:30.837 に答える