条件分岐③(3つ以上の分岐を作る『if~else if~else文』)【ゼロから始めるJavaの基礎~その18~】
前回ご紹介した『if~else文』を使用することによって、条件式の結果が『false』の場合の処理も実装することが出来るようになりました。
ところが『if~else文』で対応出来る分岐は2つまでです。さらに分岐を増やして3つ以上の分岐を作るにはどうしたらいいでしょうか?
前のページでも使用した例でいうなら、『所持金が2000円以上の場合はステーキハウスを食べる』という選択肢を増やしたくなったような場合ですね。
このような時に使えるのが『if~ else if~else文』と呼ばれる構造です。どのように使うのか、早速構文から見ていきましょう。
if (条件式①) {
条件式①の結果がtrueの場合の処理;
} else if (条件式②) {
条件式②の結果がtrueの場合の処理;
} else {
全ての条件式がfalseだった場合の処理;
}
さてさて、またややこしくなってきましたね(笑) まずはプログラムの流れを追っていきましょう。
まず1行目で1つ目の条件分岐です。この条件式の結果が『true』だった場合は、2行目に記述された処理が実行されます。
そして、この場合は3行目~7行目の処理は無視され、それ以降の処理がある場合はそちらへ進みます。(if分を抜ける)
では1行目の条件式の結果が『false』だった場合はどうなるでしょうか?
2行目の処理は条件式①の結果が『true』だった場合に実行される処理ですから、この場合は無視されますね。
そして、この場合は次に3行目に記述されている『else if(条件式)』の部分の条件式の判定に進みます。1行目と同じように条件判定が行われ、『true』だった場合は、4行目の処理が行われます。
『false』だった場合は4行目の処理は無視されます。
1行目と3行目の条件式が両方とも『false』だった場合にたどり着くのが5行目の『else』から始まるブロックです。
前回紹介した『if~else文』の『elseブロック』もそうだったように、条件すべてが『false』だった場合は『elseブロック』の中に記述された処理が実行されます。
【サンプル】
※サンプルプログラムの動かし方はこちら
int syojikin = 2500;
if (syojikin >= 3000) {
System.out.println("焼き肉を食べる");
} else if(syojikin >= 2000) {
System.out.println("ステーキを食べる");
} else if(syojikin >= 1000) {
System.out.println("ラーメンを食べる");
} else {
System.out.println("コンビニ弁当を食べる");
}
【実行結果】
まずは構文と比べて『else if』のブロックが一つ多い事に気づいた方がいらっしゃるかもしれません。
このように、『else if』ブロックは条件分岐したい条件に応じていくつでも増やすことができますので覚えておいてくださいね。
今回も分岐の内容は所持金によって食べるものを選択するサンプルにしてみました。
所持金を表すint型の変数『syojikin』には1行目で『2500』という数値が代入されています。
1つ目の条件式(3行目)は『syojikin >= 3000』となっているように、『所持金が3000円以上であるか』を判定しますが、結果は『false』なので、このブロックは実行されません。
1つ目の条件式の結果が『false』だったので、処理は5行目にある、2つ目の条件式の判定に移ります。
2つ目の条件は『syojikin >= 2000』ですので、ここでは条件式の結果が『true』となりました。
その結果6行目の処理が実行され、7行目以降の残りのif文は無視されます。
複数条件による分岐を行うための『if~else if~else文』の使い方はご理解いただけましたでしょうか?
慣れるまでは複雑に感じることもあると思いますので、ぜひ一度はサンプルの条件式の内容を変えてみたりして自分で動かして、結果がどう変わるのかなどを確認してみてくださいね!
複数条件による分岐での条件式の順番について
最後に、先程のサンプルのように複数の条件で分岐を作る場合の条件式の順番について、注意しなければいけない事がありますのでご紹介しておきます。
先程のサンプルと同じ条件で順番を逆に記述してしまった場合を例に考えてみましょう。
【サンプル】
int syojikin = 2500;
if (syojikin >= 0) {
System.out.println("コンビニ弁当を食べる");
} else if(syojikin >= 1000) {
System.out.println("ラーメンを食べる");
} else if(syojikin >= 2000) {
System.out.println("ステーキを食べる");
} else if(syojikin >= 3000) {
System.out.println("焼き肉を食べる");
}
【実行結果】
所持金は2500円なので、本来ならばコンソールには『ステーキを食べる』という文字列を表示させたいところですが、実行結果には『コンビニ弁当にする』と表示されてしまっていますね。
これは1つ目の条件式の『syojikin >= 1000』という条件の判定が『true』になってしまっているからです。
プログラマの意図としては『1000』、『2000』、『3000』という値を境界として、それぞれ分岐を行いたいのですが、変数の値が『1000』以上の場合は全て1つ目の条件式に吸収されてしまい、正しく分岐が行えていません。
プログラムは上から下へと順に実行されますので、一番最初に条件が『true』となった時点で『if文』ブロック(3-11行目)としての処理が確定してしまいます。すべての条件判定を行ってから最も妥当な選択肢を選択してくれるような便利機能はありませんので注意しましょうね。
このように、複数の条件で分岐を行う場合はプログラムの実行順序を考慮した上で、正しく分岐が行われるようなコードを記述する必要があります。
if文による条件分岐のご紹介はここまでとなります。
少し処理の流れが複雑になって来たと感じている方もいるかもしれませんね。
難しいと感じたときは、少し時間を空けてからもう一度読み直してみるのもオススメです。二度目は結構スッキリと頭に入ってきたりすることもありますよ!
if文でさらに複雑な条件での分岐を行いたい場合、『論理演算子』というものを使う方法があります。
基礎中の基礎というよりは若干踏み込んだ内容になりますので、番外編のトピックにまとめておきます。
現場に出る際には必須の知識となりますので、気が向いたらこちらもチェックしておいてくださいね!
次回からはif文とは異なる条件分岐の記述方法をご紹介します!