• 締切済み

論理演算子について

初歩的な質問だと思いますが・・・ 論理演算子の&はなんのためにあるのでしょうか? &&だけで十分な気がします。 &の右の条件が正しく動いているのかを確認するためだけのものでしょうか? 一応ですが&と&&の動作の違いはわかっていますので

みんなの回答

  • UKY
  • ベストアンサー率50% (604/1207)
回答No.5

いや、何も驚かれなくても。ビットワイズ演算子というのは要するにビット演算子のことですよ。 「C 言語にはない」というのは、確かに C には & という論理演算子がないという意味でもありますが、それ以前にそもそも C には boolean という型が存在しません。 で、Java に戻りますが、& と && の違いはニュアンスの違いというのもあると思います。 & の方は、純粋に論理的演算を行うというニュアンスです。つまり、int や long にも & というビット演算子があるのと同じように、boolean にも論理演算子があるということです。 && の方は、条件分岐を行うための仕組みというニュアンスがあります。一つ目の条件が true のときだけ二つ目の条件を調べて、最終的に全体の結果を出す、ということです。 Java 言語ではこのニュアンスの違いが分かりにくいかもしれませんが、例えば JavaScript の & と && にはこの違いがはっきりと出ています。

  • rinkun
  • ベストアンサー率44% (706/1571)
回答No.4

> もしかしてCに&の論理演算子があったりするのでは? それはビットワイズ演算子ですね。 真を1、偽を0となるようにコードを組んでいれば、Javaの論理演算子と同様に働くでしょう。 0以外真をそのまま使ったコードだと嵌まりそうです。 ちなみにAda言語にはANDとAND THENという2つの論理演算子があり、それぞれJavaの&、&&に相当します。

noname#16765
質問者

お礼

へぇ~、ビットワイズ演算子とかいう名前がついてるんですね。 そういったものがあるとは始めて知りました。

  • rinkun
  • ベストアンサー率44% (706/1571)
回答No.3

評価が副作用を伴うときは結果が変わりますね。 boolean p() {  System.out.print(" test p");  return false; } boolean q() {  System.out.print(" test q");  return false; } のとき if (p() && q()) { ... } だと「 test p」だけ印字されて if (p() & q()) { ... } だと「 test p test q」と印字される。 例では単なる印字ですが、評価関数でオブジェクトの内部状態を変更するなどしている場合もありますので、状況によっては必ず両方を評価することが求められることもあります。 まあC言語にはないですし、絶対必須の機能じゃありません。

noname#16765
質問者

お礼

答えはやっぱりその辺ですか。 >>まあC言語にはないですし ついさっき試しに、論理積に&の場合と&&の場合の場合のプログラムを作って動かしてみました。 javaと動きがどっちも同じような気がします・・・。 もしかしてCに&の論理演算子があったりするのでは?

  • jgk
  • ベストアンサー率75% (104/138)
回答No.2

左の式がtrue、falseに関わらず右の式を評価したいときでしょう。 左の式がfalseのときに右の式を評価しても、論理演算の結果はfalseで変わらないですけど、 右の式に代入や関数呼び出しが含まれている場合は、代入や関数呼び出しが行われるか行われないかの違いが出てきます。 &や|や^は両方がint等ならビット演算子ですが、両方がbooleanなら論理演算子ですね。

noname#16765
質問者

お礼

つまり関数呼び出しが出来ないかもしれないので、 まず左で判定してから、関数を呼び出すのが&&演算子ですのね? それじゃ、&だけなら、ないものを呼び出すことになるので、バグになる。 &演算子は動作を確認するためだけのもので、実際に動かすときは&&にするべきみたいなことなんでしょうか?

  • anmochi
  • ベストアンサー率65% (1332/2045)
回答No.1

&は論理演算子ではないですよ。ビット演算子と言います。例えば、 masked = origin & 0xff00; // 下1バイト分をマスクする bitset = origin | 0x0080; // 下1バイト目の最上位ビットをセットする xored = origin ^ 0x0f; // 下4ビット分のビットを反転する などの演算で、ビットマスク、ビットセット、ビット反転を行うために使用されます。if文などの中で使う論理演算子(&&や||)とはまったく別物で、ビット演算子は本来if文などの中で使うものではありません。

noname#16765
質問者

お礼

回答ありがとうございます。 しかしビット演算子にも&はありますが、論理演算子にも&はあります。 動作は簡単にいうと &なら左の結果がfalseでも右もついでに判定する &&は左の結果がfalseなら右は判定しない。 つまり自分的には 左の条件がA == NULLでfalseになったとき、 右がA.aaa() == 1みたいな事をしたらバグになるかならないかの違いだと思っているのですが・・・

関連するQ&A