• ベストアンサー

論理演算子の変数等を結ぶ個数について質問

int a=1,b=0,c=0のとき a==0 && (b==0 || c==0) a==0 && b==0 || c==0 の2つの論理式あったとします 質問:論理演算子は、必ず「左右2つの変数しかつなげない」のですか? 例えば、前者の論理演算子なら、&&は、a==0とb==0をつないでる。 後者の論理演算子なら、||はb==0 とc==0をつないでる。 質問2:質問1の仮説が正しいとすると、前者も後者も論理演算子&&は、論理演算子||とb==0を共有してますよね?

質問者が選んだベストアンサー

  • ベストアンサー
  • salsberry
  • ベストアンサー率69% (495/711)
回答No.2

「結ぶ」とか「つなぐ」という表現は意味が曖昧なので、言い換えます。&&や||は2つのboolean型の式の間で演算を行う演算子です。 【上の式】 && は a==0 と (b==0 || c==0) の間の演算 || は b==0 と c==0 の間の演算 【下の式】 演算順序に従って括弧を付けると (a==0 && b==0) || c==0 と同等だから、 && は a==0 と b==0 の間の演算 || は (a==0 && b==0) と c==0 の間の演算 どこからも「&&が||とb==0を共有」などという解釈は出てきません。

wantanton
質問者

お礼

丁重なご回答ありがとうございます! シンプルでわかりやすかったです^^

その他の回答 (1)

  • hitomura
  • ベストアンサー率48% (325/664)
回答No.1

> 質問:論理演算子は、必ず「左右2つの変数しかつなげない」のですか? まず、「つなげる」と言う言葉は論理演算子に対しては不適切です。 次に、論理演算子は変数ではなく論理値を使って論理演算を行います。だから、定数でもboolean型変数何らかの比較結果でもboolean型メソッドの戻り値でも他の論理演算の結果でもかまいません。 さらに、演算子の優先順位は&&のほうが||よりも上です。従って、前者は括弧があるため&&はa==0の結果とb==0 || c==0の結果との論理積を計算し、後者の||は優先順位の高いa==0 && b==0の結果とc==0の結果との論理和を計算します。 > 質問2:質問1の仮説が正しいとすると、前者も後者も論理演算子&&は、論理演算子||とb==0を共有してますよね? 意味不明な上、質問1の仮説が間違っているため回答いたしません。 なお、実際の計算では、  前者:a==0はfalseのためb==0 || c==0を評価せずにfalse  後者:a==0はfalseのためb==0を評価せずにa==0 && b==0をfalseとみなし、その後c==0がtrueなので全体としてはtrue と言う処理になります。この場合は問題ありませんが、その評価スキップが問題になることもありますのでご注意を。 たとえば、 class A {  public boolean foo()  {   return true;  } } A a = null; if ((a != null) && a.foo()){ // ほにゃらら } という場合、if文の条件判定をa.foo() && (a != null)とすることはできません。

wantanton
質問者

お礼

意味不明な僕の質問に丁重なご回答ありがとうございます! ソースコードまで書いてくださって参考になります!