- ベストアンサー
&と|の演算子を使ったif文のプログラムについて
↓のプログラムの実行結果について質問します。 public class Test{ public static void main(String args[]){ if(methodA() & methodB() ){ System.out.print(1); }else{ System.out.print(2); } if(methodA() | methodB() ){ System.out.print(3); }else{ System.out.print(4); } } private static boolean methodA(){ System.out.print("A"); return false; } private static boolean methodB(){ System.out.print("B"); return true; } } 上記のプログラムを実行すると AB2AB3 と出力されるのですが、 何故こういう風になるのか教えていただけませんか? また、if文の中をそれぞれ if(methodA() & methodB() ) if(methodA() | methodB() ) と書き換えると A2A3 となるのですが、これについてもイマイチよく分かりません。 メソッドからfalseとtrueを戻り値として受け取り 演算子によって処理を分けているんでしょうけど、 どういう流れで処理が行われているのか 出力結果を見ても読めなくて・・・
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
#2です。 if(methodA() & methodB() ) と if(methodA() && methodB() ) の違いは、「&」が1つだけであれば、&の前が何であっても後ろも実行されます。 「&」が2つであれば、&の前だけでそのif文の結果が決まってしまう場合、後ろは実行されません。 「if(methodA() && methodB() )」の場合、methodA()がfalseとなるので、methodB()の結果がtrueでもfalseでも、このif文はtrueになることはなく、else側に入りますので、methodB()は実行されません。 ですから、「AB2」ではなくて「A2」が出力されます。 「if(methodA() || methodB() )」ですが、こちらは「AB3」が出力されていませんか? もしくは「if(methodB() || methodA() )」となっていませんか? 「|」と「||」の違いも同様で、演算子の前だけで結果が決まるときは、後ろは実行されません。 「if(methodA() || methodB() )」の場合、methodA()の結果はfalseで、methodB()の結果次第で、ifに入るかelseに入るか判りません。 ですから、methodB()も実行され、「AB3」が出力されるはずです。
その他の回答 (4)
- auty
- ベストアンサー率58% (284/486)
初めて、&&と&や、||と|を学んだときはわけが分からなくなるのも自然のことですね。 2つだけポイントを挙げておきます。 ------------------------------------------------------------ ・ &と|は、その引数によって意味が異なってきます。(演算子として2つの意味がある。) 1. 論理値が引数のとき: 論理演算ANDとORを行う。このとき必ず両方の引数(式)を実行する。 2. その他の引数のとき: ビットごとの論理演算ANDを行う。 ・ &&と||は、論理演算ANDとORだが、それぞれに応じて、2番目の引数の実行が省略される事がある。 ------------------------------------------------------------ これらを使って論理演算を行うときは、どちらを使うかによって大変重要な違いを生じる可能性があり、十分認識して利用する必要があります。 以下のページを参考にしてみてください。[Javaの道] http://www.javaroad.jp/java_operator3.htm 大変分かりやすい説明とサンプルがあります。
お礼
なるほど・・・ こんな違いがあったんですね。 勉強になりました。 [Javaの道]見てみましたが、とても分かりやすかったです。 autyさんの説明もいつも分かりやすく、とても参考になります。 ありがとうございました。 会社の研修もサーブレットに入ってますます難しくなって きたので、またお世話になることもあると思います。 またよろしくお願いします。 あっでも、質問する前にちゃんと自分で考えたり調べたりは しているんですよ。 でもまだまだ分からない事ばかりです・・・
if(methodA() & methodB() ) methodA() と methodB() が呼び出されます。 この関数の System.out.print("A"); で画面に A が出力 戻り値として偽を返します。 同様に System.out.print("B"); で画面に B が出力 戻り値として真を返します。 if(methodA() & methodB())は論理積になり メソッドAとBが両方ともTRUEである場合のみ真になります。 この場合、TRUEとFALSEなので偽になり書き換えると if(0 & 1)=if(0)になり else(偽)の 2 が出力されます。 よって『AB2』と出力されます。 if(methodA() | methodB() ) も同様にABまでは同じです。 論理和なのでメソッドAとBのどちらか一方でも 真であれば条件が満たされたことになります。 この場合、メソッドBのみ真であるので条件が満たされた事になり 3 と出力されます。 よって『AB3』と出力されます。
補足
そうですよね、普通に考えたらそうなんですけど・・・ もしこのif文が、 if(methodA() && methodB() ) if(methodA() || methodB() ) だったら、説明いただいたようになるんじゃないかと思うんです。 でも↑この場合に出力結果は、“A2A3”で、 &と|の意味について調べたら、 「ビット単位に論理演算子」 整数型の値を演算する演算子で、trueまたはfalseに対する 演算を行う論理演算子とは異なるもの。 って書いてあったんですよ。 なんだかワケ分からなくなってしまいまして・・・ でもとても分かりやすい説明でした。 ありがとうございます。
- asamixxx
- ベストアンサー率35% (15/42)
3行目の「 if(methodA() & methodB() ){」の部分で、まず、methodA()が呼び出されるので、methodA()の中の「 System.out.print("A");」が出力されます。 次に、methodB()が呼び出され、methodB()の中の「 System.out.print("B");」が出力されます。 両方のメソッドが呼び出されたので、「 if(methodA() & methodB() ){」が判定されます。 methodA()とmethodB()の両方がtrueなら、という判定なので、falseとなり、「 System.out.print(2);」が出力されます。 「 if(methodA() | methodB() ){」も同じように、methodA()、methodB()の順に呼び出され(A、Bが出力)、if文の判定が行われます。 methodA()とmethodB()のどちらかがtrueなら、という判定ですので、trueとなり「3」が出力されます。 >また、if文の中をそれぞれ >if(methodA() & methodB() ) >if(methodA() | methodB() ) >と書き換えると もともと、 if(methodA() & methodB() ) ←コード部分3行目 と if(methodA() | methodB() ) ←コード部分8行目 ですので、書き間違えでしょうか…?
補足
あっ、ごめんなさい! 最後の方書き間違えてました。 >また、if文の中をそれぞれ >if(methodA() && methodB() ) >if(methodA() || methodB() ) >と書き換えると >A2A3 >となるのですが、これについてもイマイチよく分かりません。 ↑でした。演算子が微妙に違うんです。 &&と||の意味は分かるんですが、この場合にこそ AB2AB3という出力結果になるんじゃないかな?と思ったんですが、 結果がA2A3だったので・・・ &と|が1つだけなのと、2つあるのではどう違うんですか?
- notebleu
- ベストアンサー率45% (34/74)
methodA()は "A" を出力して、falseを返します methodB()は "B" を出力して、trueを返します if文は()の中身が真trueならば処理を行い、偽falseなら行わず、elseがあればそこに入ります。 if(methodA() & methodB()) 両方がtrueならば…methodA()はfalseなのでfalse。つまりelseに入る。 if(methodA() | methodB()) どちらかがtrueならば…methodB()がtrueなのでtrue。
お礼
>if(methodA() & methodB()) >両方がtrueならば…methodA()はfalseなのでfalse。つまりelseに入>る。 >if(methodA() | methodB()) >どちらかがtrueならば…methodB()がtrueなのでtrue。 う~ん・・・これって演算子が if(methodA() && methodB()) if(methodA() || methodB()) ↑この時の処理ではないんですかねぇ? でも答えを見る限りではこれで合っているんで、 いいのかな・・・? ==と=の違いはよく分かっているんですが、 &&と&や、||と|の違いがイマイチ分かってないみたいです。 もっと勉強します! ありがとうございました。
お礼
あっ、ごめんなさい! 「if(!methodA() || methodB() )」 ↑ ここに「!」が入ってました。 これならA3になりますよね。 う~ん…&と&&にこんな違いがあるなんて知りませんでした。 大変勉強になりました。 説明もとても分かりやすかったです。 どうもありがとうございました。