switch文、break文と流れの制御について

このQ&Aのポイント
  • JAVAのswitch文において、break文がない場合、入力した数字に関係なく、全ての条件に当てはまる処理が実行される。
  • 例えば、1を入力した場合、case 1の処理が実行されるだけでなく、その後のcase 2, case 3, defaultの処理も順番に実行される。
  • これは、switch文内の条件に一致するcaseの処理を実行した後、break文がないためにそのまま次の処理に進むためである。
回答を見る
  • ベストアンサー

switch文、break文と流れの制御について

switch文、break文と流れの制御について JAVA超初心者です。よろしくお願いいたします。 只今、テキストを使って独学でJAVAを学習しておりまして、タイトルのような内容を学習しているところで、下記のようなプログラムが例題にありました。 ------------------------------------------ package chapter10; import lib.Input; public class Ex5{ public static void main(String[] args){ int n = Input.getInt(); switch(n){ case 1: System.out.println("1です"); case 2: System.out.println("2です"); case 3: System.out.println("3です"); default: System.out.println("それ以外です"); } } } ------------------------------------------ これを実行してみますと、breakの記載がないので、「1」を入力すると -------------------- 1です 2です 3です それ以外です -------------------- と全て表示されます。「2」を入力すると -------------------- 2です 3です それ以外です -------------------- と表示されます。 そこで質問です。 breakの記載がないので、ブロックから抜け出せないのはわかるのですが、入力した数字をcaseで判定し、caseの条件に当てはまった場合、何故それ以下のSystem.out.print()が全て実行されるのかわかりません。 私の解釈では、上記プログラムで「2」を入力した場合、JAVAは上から順に case 1 →『1ではないから実行しない』 (納得) case 2 →『2が入力されているから実行』 (納得) case 3 → ??? (入力されたのは2であり、3ではないから実行されないのではないか?) default → ??? (入力されたのは2であり、「それ以外」ではないから実行されないのではないか?) と思うのです。 よろしくお願いいたします。

  • Java
  • 回答数3
  • ありがとう数0

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

  • ベストアンサー
  • ontojava
  • ベストアンサー率61% (8/13)
回答No.3

break文やreturn文が無い時にはbreak文やreturn文を探しながら実行が続けられます。この流れ込みの仕組みがあるのは、いくつかの条件に対する応答として同じ動作を行いたい場合があるからです。 例としては何月かという整数に対して日数を返す場合。 4月、6月、9月、11月は30日で同じですから case 4: case 6: case 9: case 11: return 30; このように書けます 質問者さんの例題の場合はcaseキーワードとbreak文を組にしていないと正しく動作しないのでバグになります。

その他の回答 (2)

  • buriburi3
  • ベストアンサー率44% (353/792)
回答No.2

制御構造はFORTRANの頃からある ON GOTO と同じです。 if (条件) { } else if (条件) { } の展開ではなく ON 値 GOTO CASE1,CASE2 CASE1: 文 CASE2: 文 の展開です。 なので switch( )には式ではなく値を入れますしcaseにも定数値を指定しますよね。 GOTO自体がJavaでは未実装(定義はされてる)ですので動きませんが if (n==値1) goto CASE1 ; if (n==値2) goto CASE2 ; CASE1: 文 ; CASE2: 文 ; のような実装だと思えばよいです。

  • Wr5
  • ベストアンサー率53% (2177/4070)
回答No.1

Javaでなく、C言語からの見地ですが…… 条件判定を行っているのはswitch()のところで1回だけです。 caseはただのラベルと思えばよいかと。 caseは「実行文」にはならない…と。 # だからといって脈絡もなくcaseが出てくるのはおかしいコトになりますが。

関連するQ&A

  • switch文について

    独学でjavaの勉強をしているのですが、switch文が本のとおりに入力しても エラーがでて困っています。どこが間違っているのかわかりません。 ちなみにプログラム内容は class bunki2{ public static void main(String args[]){ int a; a=1; switch (a) { case1:System.out.println("変数aの値は1です。"); break; case2:System.out.println("変数aの値は2です。"); break; case3:System.out.println("変数aの値は3です。"); break; } } } です。 これでコンパイルしようとすると’case’、’default’、または’}’がありません。とでます。 なぜできないのか教えてください。

    • ベストアンサー
    • Java
  • Switch文における、returnとbreakについて

    いつもお世話になります。 今回は、switch文において質問します。 XOOPSの中のスクリプトからですが、 ■ A code: --------------- switch($esc_type){ case 'html': return htmlspecialchars($string, ENT_QUOTES, $char_set); case 'htmlall': return htmlentities($string, ENT_QUOTES, $char_set); -----(中略)------ default: return $string; } ■ B code: --------------- switch($level){ case '1': return '\part{'; break; -----(中略)------ case '6': return '\subparagraph{'; break; } というのがありますが、 質問(1) switch文には故意にbreakを書かないのちょっと別として、 return は、breakを、省略できるのか、それともこれらは、等価なのか、 それとも、やはり、returnでもbreakを書くのがいいのか、教えてください。 質問(2) また、通常では、defaultでも、break が必要だとおもいますが、 省略?されているのも結構ありますが、breakがあるのが正解ですか? それとも、defaultでbreakはもともと必要ないのですか? これも教えてください。 どうか、よろしくお願いします。

    • 締切済み
    • PHP
  • switch で疑問。java超初心者です。

    まず、 public class P1{   public static void main(String[] args){     int n = 1;       switch(n){         case 0:           System.out.println("あ");           break;         case 1:           System.out.println("い");           break;         case 2:           System.out.println("う");           break;         default:           System.out.println("え");       }   } } は、当然「い」と表示されますよね。 default: をcase 3:にしても、問題なく「い」と表示されました。 そこで、こんな風にしてみました。 public class P3{   public static void main(String[] args){     int n = 1;     String s;       switch(n){         case 0:           s="あ";           break;         case 1:           s="い";           break;         case 2:           s="う";           break;         default:           s="え";       }       System.out.println(s);   } } これは「い」と表示されましたが、 default: をcase 3:にすると、エラーとなってしまいます。なぜでしょう。 ちなみに、エラーの内容は 変数 s は初期化されていない可能性があります。     System.out.print(s);                ^ というものでした。 そこで、 変数 s を初期化してみようと、次のように変数 s の宣言の後に null を代入しました。 String s=null; すると、「い」と表示され、エラーは出ません。 なぜ、このようになるのでしょうか。 String型の変数を使っていて、今まではこのようなエラーは出た事が無かったのですが、 どうやらswitch文の中では、初期化しろ、と出てくるようです。 わかり易い解説をいただければと思います。 これは仕様だということで、この通り受け入れるしかないのでしょうか。 勉強していて、少々腑に落ちないので、質問致しました。 よろしくお願いいたします。

    • ベストアンサー
    • Java
  • 列挙型switch文での利用が、実行できません

    或る書籍で、Javaを独習しているビギナーです。 何方か、ご教授をお願い致します。 「列挙型switch文での利用」との項目で、下記ソースプログラムをそれぞれ入力しましたが、コンパイルが、通りません、何処がおかしいのでしょうか? [Fruts10.java] enum Fruts10 { APPLE, ORANGE, BANANA } [Enum.java] class Enum { public static void main(String[] args) { for( Fruts fruts : Fruts10.values()) { switch( fruts ) { case APPLE : System.out.println("りんご :" + fruts); break; case ORANGE : System.out.println("みかん :" + fruts); break; case BANANA : System.out.println("バナナ :" + fruts); break; } } } } [Fruts.java]の方は、コンパイル通りましたが、[Enum.java]の方が、コンパイルすると、「シンボルを見つけられません、クラスFruts、変数APPLE、変数ORANGE、変数BANANA」と、エラーメッセージが、表示されてしまいます。何処がおかしいのでしょうか?

  • javaじゃんけんゲーの質問

    このjavaじゃんけんゲームで 0を押すまでじゃんけんが続いて0押したら終了して、終了と表示して、じゃんけんの勝敗が表示されるように作りたいんですけどどうしたらいいですか?教えてください import java.io.*; class kadai6 { public static void main(String args[]) throws IOException { System.out.println("これは、じゃんけんゲームです。"); System.out.println("あなたの手を入力して下さい。(1:グー、2:チョキ、3:パー、0:終了)さぁどれにしますか?"); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String str = br.readLine(); int res =Integer.parseInt(str); switch(res){ case 1: System.out.println("あなたの手はグーです。"); break; case 2: System.out.println("あなたの手はチョキです。"); break; case 3: System.out.println("あなたの手はパーです。"); break; default: System.out.println("あなたの入力した値はエラーです。1~3の値を入力してください。"); System.exit(1); break; } int comp = (int)(Math.random()*3) + 1; switch (comp){ case 1: System.out.println("コンピュータの手はグーです。"); break; case 2: System.out.println("コンピュータの手はチョキです。"); break; case 3: System.out.println("コンピュータの手はパーです。"); break; default: System.out.println ("エラーです。"); break; } switch (res -comp) { case -2: System.out.println("コンピュータの勝ちです。"); break; case -1: System.out.println ("あなたの勝ちです。"); break; case 0: System.out.println ("あいこです。"); break; case 1: System.out.println ("コンピュータの勝ちです。"); break; case 2: System.out.println("あなたの勝ちです。"); break; default: System.out.println ("エラーです。"); break; } } }

  • if文を使った問題について

    次の問題について・・・ 問題: (1)String型の変数を2個作成し、それぞれに自分の名前と年齢を設定する。 (2)標準入力を行う。 (3)標準入力された値が「name」だった場合は名前の入力されている変数の値を表示する。 (4)標準入力された値が「age」だった場合は年齢の入力されている変数の値を表示する。 (5)標準入力された値が「name」と「age」以外だった場合は「わかりません」と表示する。 出力結果: C:\>java NameAge name 岩田 C:\>java NameAge age 27 C:\>java NameAge ?? わかりません 解答例: import java.io.*; class NameAge{ public static void main(String[] args)throws IOException{ BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String hoge = br.readLine(); if(hoge.equals("name")){ System.out.println("岩田"); }else if(hoge.equals("age")){ System.out.println("27"); }else{ System.out.println("わかりません"); } } } ************************************************************ 上記の解答例以外に記述方法ってないのでしょうか? 自分は最初switch文を使って出来ると思い、 import java.io.*; class NameAge{ public static void main(String[] args)throws IOException{ BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String str = br.readLine(); switch(str){ case "name": System.out.println("岩田"); break; case "age": System.out.println("27"); break; default: System.out.println("わかりません"); break; } } } というふうに記述してみたのですが、 NameAge.java:13:互換性のない型 検出値 : java.lang.String 期待値 : int switch(str){ とエラーが出てしまいました。 恐らくstrの変数をここで使おうとしたことがいけないの だろうと解釈したのですが、 この質問の場合switch文での記述方法というのは無いですか? やはりequals()メソッドを使ってif文で記述するしかない のでしょうか?

    • ベストアンサー
    • Java
  • Javaの参考書に掲載されている問題について質問

    以下が、その問題文と解答となるソースコードです。 疑問点があるので質問します。 キーボードをタイプして変数nに整数を入力し次のように処理するプログラムを作成しなさい 5で割った余りが0ならば "5n"と表示する 5で割った余りが1ならば "5n+1"と表示する 5で割った余りが2ならば "5n+2"と表示する 5で割った余りが3ならば "5n+3"と表示する 5で割った余りが4ならば "5n+4"と表示する 以下がその答えのソースコードです。 package 第10章; import lib.Input; public class 練習10の1の2 { public static void main(String[]arg){ int n=Input.getInt(); switch(n%5){ case 0: System.out.println("5n"); break; case 1: System.out.println("5n+1"); break; case 2: System.out.println("5n+2"); break; case 3: System.out.println("5n+3"); break; case 4: System.out.println("5n+4"); } } } 質問:"5n+1"とか"5n+2"とかを表示させる意図はなんですか? 全然わからないです、、 もしかして、例えば、余りが1の場合、5*nの答えは、5*n+1だから、5n+1を表示させるということでしょうか?

    • ベストアンサー
    • Java
  • switch文について

    switch文の、switch(a)←このaの部分について分からない事があります。 例) void WRITE(void){ char str; fgets(str,8,stdin); puts(str); swicth(str){ case ??:実行文1;break; case ??:実行文2;break; ・ ↑    ・    default:break; } } としたとき、矢印の「??」の部分には文字列を指定することが可能でしょうか? 例えば、「RX」が入力されたら実行文1、「TX」が入力されたら実行文2・・・というようにしたいのですが、どう指定したらいいのかがわかりません。一文字だけなら「''」で囲むのはわかるのですが、文字列となると・・・ どなたかご教授願えませんでしょうか?

  • どこに・・・

    import java.io.*; class janken { public static void main(String[] args) throws IOException{ BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); System.out.print("あなたの手を入力して下さい。(1:グー、2:チョキ、3:パー)?\n"); String str = br.readLine(); int a = Integer.parseInt(str); switch(a){ case 1: System.out.println("あなたの手はグーです。"); break; case 2: System.out.println("あなたの手はチョキです。"); break; case 3: System.out.println("あなたの手はパーです。"); break; default: System.out.println("1~3を入力してください。"); break; } { int ran = ((int)(Math.random()*3)+1); int b=ran; switch(b){ case 1: System.out.println("コンピュータの手はグーです。"); break; case 2: System.out.println("コンピュータの手はチョキです。"); break; case 3: System.out.println("コンピュータの手はパーです。"); break; } int c; c=a-b; if(c == 2){ System.out.println("勝ち"); } else if(c== -1){ System.out.println("勝ち"); } else if(c==0){ System.out.println("あいこ"); } else if(c==1){ System.out.println("負け"); } else { System.out.println("負け"); } } } } いまjavaの勉強をしており、練習をかてね上のようにじゃんけんのプログラムを書きました。今の段階で、一様動くのですが、一回ごとにじゃんけんが終了されてしまいます。そこで繰り返し文のwhile(a != x)を使って数値を入力したら終了するように考えているんですが、whileをどこに入れたらいいのかがわかりません・・・ 自分でいろんなところに入れて試して見たんですが、無限ループになったりして、終了してくれません。どこにwhileを入れたらいいのでしょうか?それてもwhileじゃないほうがいいのでしょうか?アドバイスお願いします。

    • ベストアンサー
    • Java
  • 指定時間になってもブレイクしない

    Calendar calendar = Calendar.getInstance(); calendar.clear(); calendar.set(time_parameter[0], time_parameter[1] - 1, time_parameter[2], time_parameter[3], time_parameter[4], time_parameter[5] + 10); Time = calendar.getTimeInMillis(); System.out.println("Time"+Time); for (;;) {   if (Time == System.currentTimeMillis()) {     System.out.println("break");     break;   } } このようにして指定した時間になったらブレイクさせようとしていますが 何度か実行していますが, ブレイクしない時がちょくちょくあります. Time = calendar.getTimeInMillis();と System.currentTimeMillis()を 表示させて見ましたが, どうやらミリ秒の桁で誤差があるようで ブレイクしません. 指定時間になったら確実にブレイクさせたいのですが, どうすればよいでしょうか?

    • ベストアンサー
    • Java