8

誰かが次のことが起こっている理由を説明していただければ幸いです。どうもありがとう。

boolean b = true;
// Compiles OK.
// The LHS "assignment operand" requires no ()parentheses.
if (b=true || b==true);

// Reverse the ||'s operands, and now the code doesn't compile.
if (b==true || b=true);

// Add () around the RHS "assignment operand", and the code now compiles OK.
if (b==true || (b=true));

編集 -

ところで、コード行 #2 のコンパイル エラーは「予期しない型」であり、短絡 OR 演算子がある場所で発生します。

if (b==true || b=true);
//          ^ "unexpected type" compilation error occurs here.

編集 2 -

この質問で見つかったコード フラグメントは「高度に人為的な Java コーディング」の例であり、その結果、専門的に書かれたコードでは見られないことに注意してください。

編集 3 -

私はこの信じられないほど便利な Web サイトを初めて使用し、Java のコンパイル メッセージのスクリーンショットを作成してアップロードする方法を学びました。次の画像は、上記の最初の「編集」で提供した情報を複製したものです。これは、例のコード行 #2 のコンパイル エラーを示しています。

コード行 #2 のコンパイル エラー

4

3 に答える 3

6

代入演算子=は、論理 or 演算子よりも優先順位が低い||ため、追加の括弧のペアを使用せずに代入で論理演算子を使用できます。つまり、次のように書けるようになりたいと思うでしょう。

a = b || c;

強制的に書く代わりにa = (b || c)

残念ながら、演算子の優先順位のみを使用すると、この規則は式の左側にも適用されます。a || b = cとして解析する必要があります

(a || b) = c;

たとえあなたが意図したものがa || (b = c).

于 2013-11-15T10:43:03.543 に答える
5

割り当ては、Java で最も優先度が低くなります。したがって、最初の 2 つの式は次と同等です。

if ( b = (true || b==true) );

if ( (b==true || b) = true );

(b==true || b)式が lValue (割り当て可能なもの) ではないため、2 番目の式はコンパイルされません。

括弧を追加すると、OR の前に割り当てを行うと、すべてが機能します。

于 2013-11-15T10:43:27.700 に答える
2

演算子の優先順位(http://docs.oracle.com/javase/tutorial/java/nutsandbolts/operators.html)を使用すると、次のようになります(優先順位を示すために括弧を追加しました):

  1. if (b=(true || (b==true)))b式に割り当てられ、 を返すbooleanため、条件に適合します。

  2. if (((b==true) || b)=true)、左側は代入演算子には適合しません (変数ではなく式であるため)。

  3. if (((b==true) || (b=true)))booleanwith と比較booleanOR、 rightbooleanは変数であり、割り当てられた値を返すbooleanためです。b=

于 2013-11-15T10:51:28.190 に答える