質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

2回答

754閲覧

Javaのswitch/caseの仕様が分からない

Yuki2

総合スコア52

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2021/08/21 12:56

編集2021/08/21 13:23

出力結果に納得がいかない。

以下のコードを実行するとorange apple apple otherと表示される。
どのような原理でコードが動いているのか知りたい。

該当のソースコード

java

1public class Main { 2 public static void main(String[] args) { 3 String[] ary = { "orange", "Apple", "Banana" }; 4 for (String str : ary) { 5 switch (str) { 6 case "orange": 7 System.out.println("Orange"); 8 case "Apple": 9 System.out.println("Apple"); 10 break; 11 default: 12 System.out.println("other"); 13 } 14 } 15 } 16}

試した事

java

1public class Main { 2 public static void main(String[] args) { 3 String[] ary = { "orange", "Apple", "Banana" }; 4 for (String str : ary) { 5 switch (str) { 6 case "orange": 7 System.out.println("Orange"); 8 case "Apple": 9 System.out.println("Apple"); 10 // break; 11 default: 12 System.out.println("other"); 13 } 14 } 15 } 16}

break文をコメントアウトして処理を確認した。
orange apple other apple other otherと表示された。

不明点

①break文を挟まない事でなぜ6つ、文字列が表示されたのか。
②1回目のotherが表示された後、なぜorangeがスキップされてしまうのか。
③1回目のotherが表示された後、なぜ再び処理が繰り返されてしまうのか。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

問題を分割して、考えてみたらどうでしょうか?

まず、for文は3回実行されます。

java

1public class Main { 2 public static void main(String[] args) { 3 String[] ary = { "orange", "Apple", "Banana" }; 4 for (String str : ary) { 5 System.out.println(str); //「orange、Apple、Banana」を出力 6 } 7 } 8}

switch文は、以下のような動作になります。

  1. orangeの場合、breakが無いので「Orange、Apple」を出力
  2. Appleの場合「Apple」を出力
  3. Bananaの場合「other」を出力

つまり、全て実行すると「Orange、Apple」「Apple」「other」が出力されます。

java

1public class Main { 2 public static void main(String[] args) { 3 //文字列に、"orange" か "Apple" か "Banana"を指定 4 String str = "orange"; 5 switch (str) { 6 case "orange": 7 System.out.println("Orange"); 8 //Orangeの場合は、breakが無いので、下も実行され「Orange、Apple」を出力 9 case "Apple": 10 System.out.println("Apple"); 11 //Appleの場合は、breakで終了するので「Apple」を出力 12 break; 13 default: 14 System.out.println("other"); 15 // Bananaの場合は、「other」を出力 16 } 17 } 18}

なお、switch文で、breakを書かない方法を「フォールスルー(Fall-through)」と呼ぶのですが、これはバグの温床になるとされています。

Javaを長年やってきましたが、業務システムで「フォールスルー」を積極的に使っているチームは見たことがありません。
Switch文は、基本的にbreakを使うので、難しく感じるうちは「フォールスルー」を利用しない = つまり、必ずbreakを使った方が良いと思います。

投稿2021/08/21 14:22

編集2021/08/21 15:19
KT001

総合スコア659

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Yuki2

2021/08/21 14:31

他の回答者様の回答も含めて、ようやく理解する事が出来ました。 本当にありがとうございます。
guest

0

forが分からないんじゃ無くてswitch/caseが分からないということです。

ここではbreakswitchのブロックから抜け出す(ブロックの終わりの次に制御を移す)ということです。
breakが出てくるまで文は実行されますので、
Orangeの時は、System.out.println("Orange");System.out.println("Apple");が実行されその次はbreak;なのでそこで終わり。
Appleの時は、System.out.println("Apple");が実行されその次はbreak;なのでそこで終わり。
どちらでも無い場合は、System.out.println("other");が実行されて、その次には何も無いのでそこで終わり。

投稿2021/08/21 13:07

otn

総合スコア85901

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Yuki2

2021/08/21 13:21

よくわかりません。 break;が記載されているコードはappleが2回連続で表示され、その後なぜかotherまで表示されています。 break;がswitchのブロックから抜け出す効果を持つのであれば、orange,appleで処理は終わるはずです。
maisumakun

2021/08/21 13:37

> break;が記載されているコードはappleが2回連続で表示され、その後なぜかotherまで表示されています。 最後のotherはstr="Banana"の際に表示されたものです。
Yuki2

2021/08/21 13:47

break;によりswitch文から処理が抜けるのであればorange,appleと2つ文字列が表示されるだけで終わるはずです。
maisumakun

2021/08/21 13:48

switchからは抜けますが、forは抜けません。strを変えてswitch全体が3回実行されます。
Yuki2

2021/08/21 13:58

なぜorange,apple,apple,otherと四つの文字列が表示されるのでしょうか。 break;文で終了したはずのappleが連続で表示されています。 orange,apple,banana、各文字列がcaseに従って一つずつ処理されるのであればbreak;が何の意義を果たしているのか理解できません。 何のためにbreak;は存在しているのでしょうか?
maisumakun

2021/08/21 14:05 編集

for1回目(str="orange"): "Orange"、"Apple"を表示、Appleの後でbreak for2回目(str="Apple"): "Apple"を表示、Appleの後でbreak for3回目(str="Banana"): "other"を表示 > break;文で終了したはずのappleが連続で表示されています。 switchが終了したので、forの次の実行に進んでいるだけです。 > 各文字列がcaseに従って一つずつ処理されるのであれば 条件が成立していません。
Yuki2

2021/08/21 14:11

配列がどのようにしてstrに格納されているのか、イメージする事が出来ました。 ただ1回目のorangeで何故、Appleを表示させることが出来るのでしょうか? orangeはcase "Apple"ではないので、条件には当てはまりません。
maisumakun

2021/08/21 14:12

> orangeはcase "Apple"ではないので、条件には当てはまりません。 当てはまりませんが、breakがないのでそのまま進んでいってしまっています。
jimbe

2021/08/21 14:14

maisumakun さんご提示の繰り返しイメージのように、 for 文 と switch 文の間に、 System.out.println("---- str="+str); のような、for での繰り返しが分かる"区切り"を入れて実行してみては如何でしょう。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問