初心者のJavaプログラミングクラスでこの質問がありますが、私の本では「|」が1つだけ見つかりません。オペレーターとしてを意味します。
質問は:
int j = 0;
if ((8 > 4) | (j++ == 7))
System.out.println("j = " + j);
j = 1ですか?
理由を説明。
この本では、OR演算子「||」について説明しています。例を示しますが、この単一の「|」は表示されません。演算子の意味は2つの間で変わりますか?
はい、意味が変わります。||
は論理or
演算子|
ですが、はビット単位or
です。
この演算子はビットレベルで動作するため(...)、と同じように短絡することはありません||
。つまり、第1オペランドが、であってもtrue
、第2オペランドが評価されます。
これらの演算子のandフォームではなく、 ||
andフォームを使用する場合、Javaは右側のオペランドだけを評価する必要はありません。&&
|
&
Boolean b = true;
if(b || foo.test())
{
//we entered without calling test()
}
if(b | foo.test())
{
//we entered calling test()
}
|
->これはビット単位のOR演算子であり、ビット単位の包括的OR演算を実行し、両方のオペランド(右と左)を実行します。
ビットごとのOR「|」オペランドのビットの一方または両方が1の場合、演算子は1を生成します。ただし、両方のビットが0の場合、この演算子は0を生成します。より正確にはOR "|" 演算子は、両方のオペランドの両方のビットが0の場合を除いて、すべての場合に1を返します。
if ((8 > 4) | (j++ == 7)) System.out.println("j = " + j);
ここ8>4
に戻りtrue
、j++ == 7
戻りfalse
ます。したがって、if(true|false)
ビット単位の演算子はtrue
または1を返し、j++の後に1になったjの値を出力します。
演算子はビット単位の|
ORですが、ブール変数でビット単位のORを使用するのはなぜでしょうか。
論理OR演算子(||
)には、短絡と呼ばれる機能があります。これは、左側のオペランドがと評価された場合、true
それ以上の処理は行われず、右側のオペランドも評価されないことを意味します。ただし、ビットごとのOR演算子|
は常に両方のオペランドを評価し、ブールオペランドに適用される場合は、両方を評価してから、単純または結果に適用します。
あなたの場合、(j++ == 7)
の結果に関係なく、は常に評価されます8 > 4
。||
これは、オペレーターでは発生しません。したがってj
、1ずつインクリメントされ、プログラムの出力はです1
。
jは0で初期化されますが、これ以降は割り当てられないため、答えは「いいえ」です。したがって、jの値は常に0のままです。