プロが教えるわが家の防犯対策術!

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を共有してますよね?

A 回答 (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を共有」などという解釈は出てきません。
    • good
    • 0
この回答へのお礼

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

お礼日時:2011/06/12 16:10

> 質問:論理演算子は、必ず「左右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)とすることはできません。
    • good
    • 0
この回答へのお礼

意味不明な僕の質問に丁重なご回答ありがとうございます!

ソースコードまで書いてくださって参考になります!

お礼日時:2011/06/12 16:06

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!