ITエンジニアのプレイングマネージャー化応援サイト

4.条件分岐と判定条件

この記事では、弊社の新人エンジニア研修の参考にJava8を解説します。

前回は演算子について解説しました。

今回は条件分岐と判定条件について解説します。

あわせて、前回の演算子の続きで、

・関係演算子(比較演算子とも呼ばれます)
・三項演算子
・論理演算子

についても触れていきます。

1.if文

if文を使い条件に応じて処理をさせたり、させなかったりといったプログラムが作成できます。

例えば、「もしも、20歳以上なら酒を飲む」といった処理です。

if(20歳以上){

 酒を飲む;

}

一般化すると以下のように書けるでしょう。

<構文>

if(条件式){

 命令文;

}

上記の命令文は条件がtrueの場合に実行されます。

条件式はboolean型の値、つまり true または false という値を持つものであればなんでもOKです。

 Javaで書くと以下のようになります。

このプログラムを実行すると条件式の値はtrueのため標準出力には「酒を飲む」と出力されます。

条件式の値がfalseの場合(例えば、age = 19)は何も出力されません。

 

条件がtrueの場合のみ処理をするif文

条件がtrueの場合のみ処理をするif文

この時の、「>=」記号を関係演算子と呼びます。

関係演算子とは、2つの式や値の比較を行い、結果を真偽値で返すもののことをいいます

関係演算子の解釈で新入社員の皆さんにアドバイスできることとしては、あまり長々と考え込まないことです。

true or false の判断さえできれば大丈夫です。

例えば、

age >= 20

というのも長々と見ているとだんだん意味がぼやけてしまうからです。(ゲシュタルト崩壊)

実際に変数に値を入れて、

20 >= 20

をtrueと判断できれば大丈夫です。

 

2.関係演算子

ここで、Javaの判定条件を構成する関係演算子をまとめましょう。

以下のサンプルコードを見てください。

<結果は下記の表の右端列>

関係演算子 読み方 説明 式の例 結果(値)
== イコールイコール 左辺と右辺が等しい 1 == 1 true
!= びっくりイコール 左辺と右辺が等しくない 1 != 2 true
> 大なり 左辺が右辺より大きい 1 > 2 false
< 小なり 左辺が右辺より小さい 1 < 2 true
>= 大なりイコール 左辺が右辺以上である 1 >= 2 false
<= 小なりイコール 左辺が右辺以下である 1 <= 2 true
instanceof ※後述 インスタンスオブ 左辺が右辺のクラスまたはそのサブクラスのインスタンスである Integer i = 1; 
i instanceof Number;
true

前回解説したように=が一つは代入の意味でした。

そのためJavaで等しいを表現するには「==」と=を2つ重ねます。

ここはベテランでも間違いやすいところです。

また、「より大きい(超過)」と「以上」、「より小さい(未満)」と「以下」も厳密に使い分ける必要があります。 

練習問題をやってみましょう。

問題 解答 変数aの値が19である時
1.変数aの値が20である a == 20 false
2.変数aの値が20でない    
3.変数aの値が20より大きい    
4.変数aの値が20より小さい    
5.変数aの値が20以上である    
6.変数aの値が20以下である    

 

なお、 命令文が1つだけの場合は{}を省略することも可能です。

以下のプログラムは上記プログラムと同じ結果になります。

<結果>

酒を飲む

ただし、うっかりすると以下のように条件に応じた処理の範囲を間違えることもあります。

未成年に対しては酒も煙草も禁じるつもりで以下のように書くと意図しない結果になります。

<結果>

煙草も吸う

したがって、一文の処理であっても{}で囲むことは良い習慣です。

※IDEのフォーマットをかけてもそうなるのではないでしょうか?

ただし、他人の書いたコードは{}で囲まれていないことも想定してください。

 

3.if else文

例えば、「もしも、20歳以上なら酒を飲む、そうでなければジュースを飲む」といった表示をさせたい場合はどうすればいいでしょうか?

条件がfalseの場合にも処理をするif文

条件がfalseの場合にも処理をするif文

多分岐構造にはif else文が使えます。

if(20歳以上){

 酒を飲む;

} else {

 ジュースを飲む;

}

 Javaで書くと以下のようになります。

<結果>

ジュースを飲む

ちなみに if~else文はIDEのコードテンプレートという機能を使うと簡単にひな形が挿入できますので講師から聞いてください。

 

このプログラムを実行すると条件式の値はfalseのため標準出力には「ジュースを飲む」と出力されます。

では、さらに細かく条件ごとの処理に分岐させたい場合はどうしたらよいでしょうか?

以下のように  if~else文を連結することができます。

なお、“ifelse”ではなく、“if else”のようにifとelseの間にはスペースが入ります。

点数(score)によってS,A,B,Cの4段階評価を行います。

<結果>

A

ただし、条件が多くなると記述が複雑になってしまうのがif else文の欠点です。

そんな時には次のswitch文の利用を検討してみましょう。

 

4.switch文

switch文はアルゴリズムでいう多岐分岐を扱う文です。

文法は以下の通りです。

<構文>

switch (式) {

   case 値A: // 式の値が値Aだったときの処理 break;

   case 値B: // 式の値が値Bだったときの処理 break;

   default: // 式の値がいずれのcaseの値とも一致しなかったときの処理

}

switch文の値で使える型は、char、byte、short、int、String、enum(後述)があります。

default句は値がどのcaseの値とも一致しなかった場合の処理を記述するためにあります。

このswitch文もIDEのコードテンプレートによって簡単にひな形が挿入できますので講師から聞いてください。

<結果>

B

ただし、スイッチの状態にはオンとオフしかなく、中間はありません。

同様にswitch文は何かの間を表現することはできません。

例えば、「60以上70未満」の場合、といった表現は不可能です。

そのような場合はif文を使います。

 

なお、break句が使用されない場合、一致するケースの後のすべてのswitch文が終わりまで順番に実行され意図しない結果になることがあります。

<結果>

B
A
D

フォールスルー(fall through)といいバグの温床になり得ます。

あえてフォールスルーさせるとき以外は、気をつけてください。

 

5.三項演算子

ここでは、少し応用的なテーマとして三項演算子を紹介します。

三項演算子を使うと一文で簡潔に分岐構造を表現できます。

三項演算子の基本構文は以下の通りです。

<構文>

条件式 ? 値1 : 値2

条件式がtrueの場合に、式全体の値が値1に、falseの場合には値2になります。

値の位置に処理が書けるわけではありませんので気をつけましょう。

具体例で見てみましょう。

<結果>

Yes
三項演算子の見方

三項演算子の見方

ただし、

三項演算子を多用することには可読性を低くするという批判もあります。

極端に複雑な入れ子構造を使用したりはしないようにしましょう。

 

6.論理演算子

論理演算子を使うと複雑な条件式を組み合わせることができます

論理演算子は次の4種類です。

演算子 読み方 式がtrueになる条件 使用例
&& かつ AND 左辺と右辺の両方がtrue gender == ‘F’ && age >= 16
|| または OR すくなくとも左辺と右辺のどちらかがtrue gender == ‘F’ || age >= 16
! 否定 NOT 条件式がfalse !(gender == ‘F’ )
^ XOR(エクスオアー) 左辺と右辺のどちらかがtrueで他方がfalse gender == ‘F’ ^ age >= 16

xorは結構ですので、まずは、AND、OR、NOTを押さえましょう。

以下のサンプルコードで確認してください。

<結果>

true
false
true
false
true

例えば、学生の成績を付けるプログラムを考えます。

英語(English)と数学(Math)それぞれ100点満点のテストで評価はS,A,B,Cの4段階評価とします。

英語と数学の両方が80点以上だったらS評価。

どちらか一方が80点以上だったらA評価。

どちらか一方が70点以上だったらB評価。

それ以外はC評価とします。

<結果>

A

論理演算子なしで同じコードを書こうとしたら大変です。

 

演算子がいくつか出てきたところでその優先順位についてまとめます。

算術演算子 > 関係演算子 > 論理演算子

の順に優先されます。

まず、算術演算子は関係演算子より優先されます。

例えば、

a + 1 > b -10

という式は以下のように解釈されます。

(a + 1) > (b -10)

※()内が優先される

また、関係演算子は論理演算子より優先されます。

gender == ‘F’ && age >= 16

という式は以下のように解釈されます。

(gender == ‘F’) && (age >= 16)

 

また、論理積は論理和よりも優先されますが、カッコを使うことで論理和を優先させることができるということは、数学の類推で理解可能だと思います。

a > 10 && b < 5 || c == 0

a > 10 && (b < 5 || c == 0)

 

さらに論理を否定した場合についても整理しておきます。

例えば、

a + 1 > b -10

という式の否定を単純に書けば、以下のようになります。

!(a + 1 > b -10)

また、カッコを開いて以下のように書くこともできます。

a + 1 <= b -10

すなわち、否定は、不等号の向きを逆にして、イコールがなければ付ける、イコールがあれば取り去る、で大丈夫です。

 

また、論理演算子の否定の場合は「&&は||」に、「||は&&」に変換します。

つまり、

!(gender == ‘F’ && age >= 16)

という式は以下のように解釈されます。

gender != ‘F’ || age < 16

いずれにせよ、わかり易い表現を採用しましょう。

 

簡単な練習問題をやってみましょう。

問題 解答 a = 19 , b = 1のとき
1.変数aの値が20である かつ 変数bの値が1である。 a == 20 && b ==1 false
2.変数aの値が20である または 変数bの値が1である。    
3.上記1の否定(括弧なし)    
4.上記2の否定(括弧なし)    

気をつけないといけないのは、日本語で「aまたはbでない」といった時に2つの意味がありえることです。

!(a or b)

か、それとも

a or !b

かです。

“ない”がどこに掛かっているのかを明確にする必要があるのです。

 

<まとめ:隣の人に正しく説明できたらチェックを付けましょう>

□if文を使い条件に応じて処理をさせたり、させなかったりといった処理ができる
 
□関係演算子とは、2つの式や値の比較を行い、結果を真偽値(true or false)で返すもののことをいう
 
□多分岐構造にはif else文やswitch文が使える
 
□三項演算子を使うと一文で簡潔に分岐構造を表現できる
 
□論理演算子を使うと複雑な条件式を組み合わせることができる

 

まとめができたら、アウトプットとして演習問題にチャレンジしましょう。

問題4.条件分岐

 

今回はJavaの条件分岐と判定条件について見てきました。

次回は、繰り返し処理を学んでコンピューターのパワーを実感しましょう。

 

【今回の復習Youtube】
 
 
 

 

JavaSE8の解説に戻る

PAGETOP
Copyright © Say Consulting Group, Inc. All Rights Reserved.