1

Java 演算子の優先順位テーブルを介して:

'|' 論理 OR 演算子は、'&&' 論理 AND 演算子よりも優先されます。

次のコードを使用して上記の事実を確認しました

int y = 5;
int x = 2;
if(  x++  >  2  &&   ++y  >  2  |  true    )
; //do nothing
System.out.println("x = " + x + " y = " + y);

しかし、出力を与える行の上 -

x = 3 y = 5

x++ が最初に評価されることを示しています。

| の前後の条件に括弧を付けても

if(  x++  >  2  &&   (++y  >  2  |  true) )
;

しかし、それでも同じ出力が得られます。

この場合、演算子の優先順位が機能しないのはなぜですか?

4

6 に答える 6

2

|ビットごとの OR 演算子です。を探してい||ます。似ていますが、優先順位が高く、短絡評価を適用しないという点で異なります。

私はあなたが今何を本当に求めているかを理解しています。&&ifの優先順位が最も低いのに、ステートメントの残りの部分が最終的に到達する前に評価されないのはなぜだろうと思っています。だから

x++  >  2  &&   ++y  >  2  |  true 

評価しx++ > 2++y > 2 | true最後に適用する必要があります&&。答えは、&&短絡評価を適用することです。確かに、すべて評価してからその効果を適用できます。それがビットごとの演算子の機能です。しかし、そうではありません

if (a && b && ...)

と同様に動作するはずです

if (a) {
   if (b) {
      ...
   }
}

演算子の優先順位はお察しのとおりですが、演算子の性質上、評価が早く終了してしまいます。に戻ります

x++  >  2  &&   ++y  >  2  |  true 

これx++ > 2は false であるため、++y > 2 | true評価されません。

于 2013-05-28T05:22:16.867 に答える
1

Even if the operator | has higher precedence, the operator isn't even discovered at the point where the program checks if calculating the right-hand side (of &&) is necessary.

Consider the statement (true && true | true). This is how it is calculated:

  1. Check (true && ...) to see if further operations are necessary, (which is the case).
  2. Higher precedence: Perform the operation (true | true) -> true.
  3. Lower precedence: Perform the operation (true && true) -> true.

In your case, since (x++ > 2) gives false, the right-hand side of && is never even touched.

于 2013-05-28T05:54:33.917 に答える
0

論理演算子(&&、||、&、|、および ^) は、2 つのブール式を評価するためにのみ使用できます。

&& と & の違いは、&& 式の結果が true になることはあり得ないため、&& 演算子は、左側のオペランドが false と評価された場合に、右側のオペランドをわざわざテストしないことです。

|| の違い と | それは||です 結果がその時点で真であることがすでにわかっているため、演算子は、左のオペランドが true と評価された場合、右のオペランドをわざわざテストしません。

ビット単位の演算子: (&、|、および ^) は、「ビット単位」演算子として呼び出すこともできます。ビット演算子は、2 つの変数をビットごとに比較し、比較対象の 2 つの変数のそれぞれのビットが両方とも「オン」(&) であるか、どちらか一方が「オン」(|) であるかに基づいて、ビットが設定された変数を返します。 、または正確に 1 つの「オン」(^)。

于 2013-05-28T06:16:36.683 に答える
0

&& の場合、最初の条件をチェックするように最適化されているため、中括弧を何に配置しても、左から右に開始されるため、false になり、なぜ 2 番目の条件に移動するのか、中括弧が存在しても 、2 番目に x++ になりますget execute 、 condition get false であるため、同じ出力が出力されますが、|| を使用して言うと

class Test{
public static void main(String[] args) {

    int x=2,y=5;
    if(  x++  >  2  ||   (++y  >  2  |  true) )
        ;

    System.out.println(x +" "+y  );

}   
}

3 6||印刷されます。最初の条件は false になりますが、2 番目の条件になると、++y > 2 は true に評価されます | ブール値の間は、ビット単位の OR に基づいて出力を返します。これtrue OR trueは true です。

于 2013-05-28T05:33:07.333 に答える