• ベストアンサー

&と|の演算子を使った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を戻り値として受け取り 演算子によって処理を分けているんでしょうけど、 どういう流れで処理が行われているのか 出力結果を見ても読めなくて・・・

noname#205525
noname#205525
  • Java
  • 回答数5
  • ありがとう数4

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

  • ベストアンサー
  • asamixxx
  • ベストアンサー率35% (15/42)
回答No.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」が出力されるはずです。

noname#205525
質問者

お礼

あっ、ごめんなさい! 「if(!methodA() || methodB() )」    ↑ ここに「!」が入ってました。 これならA3になりますよね。 う~ん…&と&&にこんな違いがあるなんて知りませんでした。 大変勉強になりました。 説明もとても分かりやすかったです。 どうもありがとうございました。

その他の回答 (4)

  • auty
  • ベストアンサー率58% (284/486)
回答No.4

初めて、&&と&や、||と|を学んだときはわけが分からなくなるのも自然のことですね。 2つだけポイントを挙げておきます。 ------------------------------------------------------------ ・ &と|は、その引数によって意味が異なってきます。(演算子として2つの意味がある。)      1. 論理値が引数のとき: 論理演算ANDとORを行う。このとき必ず両方の引数(式)を実行する。      2. その他の引数のとき: ビットごとの論理演算ANDを行う。 ・ &&と||は、論理演算ANDとORだが、それぞれに応じて、2番目の引数の実行が省略される事がある。 ------------------------------------------------------------ これらを使って論理演算を行うときは、どちらを使うかによって大変重要な違いを生じる可能性があり、十分認識して利用する必要があります。 以下のページを参考にしてみてください。[Javaの道] http://www.javaroad.jp/java_operator3.htm 大変分かりやすい説明とサンプルがあります。

noname#205525
質問者

お礼

なるほど・・・ こんな違いがあったんですね。 勉強になりました。 [Javaの道]見てみましたが、とても分かりやすかったです。 autyさんの説明もいつも分かりやすく、とても参考になります。 ありがとうございました。 会社の研修もサーブレットに入ってますます難しくなって きたので、またお世話になることもあると思います。 またよろしくお願いします。 あっでも、質問する前にちゃんと自分で考えたり調べたりは しているんですよ。 でもまだまだ分からない事ばかりです・・・

noname#57874
noname#57874
回答No.3

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』と出力されます。

noname#205525
質問者

補足

そうですよね、普通に考えたらそうなんですけど・・・ もしこのif文が、 if(methodA() && methodB() ) if(methodA() || methodB() ) だったら、説明いただいたようになるんじゃないかと思うんです。 でも↑この場合に出力結果は、“A2A3”で、 &と|の意味について調べたら、 「ビット単位に論理演算子」 整数型の値を演算する演算子で、trueまたはfalseに対する 演算を行う論理演算子とは異なるもの。 って書いてあったんですよ。 なんだかワケ分からなくなってしまいまして・・・ でもとても分かりやすい説明でした。 ありがとうございます。

  • asamixxx
  • ベストアンサー率35% (15/42)
回答No.2

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行目 ですので、書き間違えでしょうか…?

noname#205525
質問者

補足

あっ、ごめんなさい! 最後の方書き間違えてました。 >また、if文の中をそれぞれ >if(methodA() && methodB() ) >if(methodA() || methodB() ) >と書き換えると >A2A3 >となるのですが、これについてもイマイチよく分かりません。 ↑でした。演算子が微妙に違うんです。 &&と||の意味は分かるんですが、この場合にこそ AB2AB3という出力結果になるんじゃないかな?と思ったんですが、 結果がA2A3だったので・・・ &と|が1つだけなのと、2つあるのではどう違うんですか?

  • notebleu
  • ベストアンサー率45% (34/74)
回答No.1

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。

noname#205525
質問者

お礼

>if(methodA() & methodB()) >両方がtrueならば…methodA()はfalseなのでfalse。つまりelseに入>る。 >if(methodA() | methodB()) >どちらかがtrueならば…methodB()がtrueなのでtrue。 う~ん・・・これって演算子が if(methodA() && methodB()) if(methodA() || methodB()) ↑この時の処理ではないんですかねぇ? でも答えを見る限りではこれで合っているんで、 いいのかな・・・? ==と=の違いはよく分かっているんですが、 &&と&や、||と|の違いがイマイチ分かってないみたいです。 もっと勉強します! ありがとうございました。

関連するQ&A

  • javaプログラムについて

    mainメソッド内の指定された部分の処理を、 別のメソッドに分けてください。 mainメソッド内から作成した別メソッドを呼び出して 実行できるようにしてください。 ※分ける前と分けた後で処理結果が変わらないこと (入力された文字が"A"の場合true, それ以外の場合falseを返すように) */ class MethodAdd1{ public static void main(String[] args){ /* // ★ここから if("A".equals(args[0])){ judge = true; }else{ judge = false; } // ★ここまで */ boolean judge; if("A".equals(args[0])){ System.out.println("true"); }else{ System.out.println("false"); } } /* **戻り値:boolean **引数:String */ //ここにメソッドを作成 public static boolean equals(String a){ String str="A"; if("A".equals(str)){ return true; }else{ return false; } } } これで一応trueかfalseと表示されるのですが、合っているのか分かりません。 お時間のある方で、手直しをして頂ける方お願い致します。

  • return文について質問

    以下は、あるJavaの参考書の問題を僕が解いてソースコードに起こしたものです。その際のエラーが出てしまうことについて、その原因を質問させていただきます。 package 第16章; public class 練習16_4_4 { public static void main(String[]arg){ double[]dt={55.1,23.0,168.8,25.6,33.1,101.5}; System.out.println(isOver100(dt)); } public static boolean isOver100(double[]a){ for(double x:a){ if(x>100.0){ return true; }else{ return false; } } } } 質問:『public static boolean isOver100(double[]a){』、ここの部分でエラーとして「このメソッドは型booleanの結果を戻す必要があります」と表示されます。何故ですか?だって、return文で型booleanであるtrueやfalse返してるのに、、 まったく原因わかりません。

    • ベストアンサー
    • Java
  • Javaのif文がわかりません!

    public class If2 {   static boolean b1, b2;   public static void main(String[] args) {     int x = 0;     if ( !b1 ) {     if ( !b2 ) {       b1 = true;       x++;       if ( 5 > 6) {         x++;       }       if ( !b1 ) x = x + 10;       else if ( b2 = true ) x = x + 100;       else if ( b1 | b2 ) x = x + 1000;       }     }     System.out.println(x);    }  } ------------------------------------------------------------ 正常にコンパイルされ、101とでます。 if文の()内にある!b1というのが意味が分かりません^^; 2行目でb1とb2はfalseになるのは分かりましたが !b1や!b2はfalseではない!ということですか? 誰か教えてください!よろしくお願いします!!

  • booleanについて

    お世話になります。 javaを始めて10日程の初心者です。 boleanの使い方がよく分かりません。 例: public class a { public static void main(String[] args){ // "あなたは20歳以上ですか?(Yesならtrue、Noならfalse)"; boolean isAdult = true; if (isAdult) { System.out.print(" 成人です "); } else { System.out.print(" 子供です "); } } } これを実行すると、”成人です”が出力されます。 例えばbooleanを使用せずに int age; if(age>=20) { System.out.print(" 成人です "); } else { System.out.print(" 子供です "); } とすれば解決できるのですが、 booleanを使用しようとすると理解できなくなります。 宜しくお願いします。

  •  php if文について

    phpの問題をといていてどうしてもわからないので教えて下さい。 お願いいたします。 if(【 A 】) { print("true"); } else { print("false"); } 【1】"php" > "perl" 【2】0 != "0" 【3】5 - 6 + 1 【4】"false" 【5】0 + "false" 【6】"543a" < 56 【7】abs(-6) > 10 / 2 あなたの回答: 【1】【4】 正答: 【1】【4】【7】 回答が1,4,7なのかわかりません。 教えて下さい。

    • ベストアンサー
    • PHP
  • for文

    質問お願い致します。 これのソースのfor文を一つの文にするにはどのように書いたらよいでしょうか? お願い致します。 //指定された文字列が"a"と"b"の両方を含む場合はtrue、なければfalseを返す public class Mondai { public static void main(String[] args) { System.out.println("解答 :" + charBothContain("Habllow")); } public static boolean charBothContain(String str) { boolean answer1 = false; boolean answer2 = false; for (int i = 0; i < str.length(); i++) { char c = str.charAt(i); if (c == 'a') { answer1 = true; break; } } for (int i = 0; i < str.length(); i++) { char c = str.charAt(i); if (c == 'b') { answer2 = true; break; } } return answer1 && answer2; } }

    • ベストアンサー
    • Java
  • 文が指定されていませんエラーについて

    public class Stack2 { private static int[] stack = new int[50]; private static int ip = -1; //スタックポインター, -1ならデーターなし public static int push ( int inData ) { // データー格納 if (ip == (stack.length - 1)) { System.out.println(\"スタックがいっぱいです\"); } else { stack[++ip] = inData; } } public static int pop ( ) { // データー取り出し if ( ip < 0 ) { System.out.println (\"スタックにデーターがありません\"); return -2147483648; } else { return stack[ip]; } } } 「Stack2.java:10:return 文が指定されていません」コンバイルエラーになります。 どのようにデバックすれば良いのか教えてください。

  • 変数booleanの扱い方

    下記のコードでコンパイルしたところ、出現 int 互換性のない型 要求:boolean boolean bl = 0 ; とエラーが出ました。コード上でまず、bl = 0 と0が入るのがまず分からないのと、trueとfalseを入れ換えているのがわかりません。すみませんが、かなりわかってないので、出来るだけ詳しく説明お願いします。 boolean bl = 0; for(int i=0; i<5; i++) for(int j=0; j<5; j++) if(bl == false){ System.out.print('*'); bl = true; } else{ System.out.print('-'); bl = false; } } お決まりのクラス宣言などのコードは省きました。

    • ベストアンサー
    • Java
  • if文にて…。

    public class Sample{ public static void main (String[] args){ if(player1.hp < 0) { System.out.println("(+_+)"); }else if(hp <= 10){ System.out.println("(T_T)"); }else if(hp <= 100){ System.out.println("(^^)"); }else{ System.out.println("(^-^)"); } CharData player1 = new CharData("ジャガー",250,20); CharData player2 = new CharData("ハマー",10,30); System.out.println("NAME:"+player1.name); System.out.println("HP:"+player1.hp); System.out.println("MP:"+player1.mp); System.out.println("NAME:"+player2.name); System.out.println("HP:"+player2.hp); System.out.println("MP:"+player2.mp); } } このようなプログラムを作成してコンパイルしようとしても、 if(player1.hp < 0)と }else if (hp <= 10){ }else if (hp <= 100){ のplayer1のpとhpのhのところに ^ のマークがありシンボルを解決できません。と出てコンパイルが通りません。 どのようにすれば通るようになるのか教えてください。

    • ベストアンサー
    • Java
  • if文で・・・

    booleanの判定するときのif文の書き方ですが、 (1) if( !flg ) then (2) if( flg != true ) then (3) if( flg == false ) then のどれにしますか?

専門家に質問してみよう