こんにちは。ECF Techブログ
担当 Michiharu.Tです。
Javaプログラミング入門記事の第4章をお送りいたします。
第4章のテーマは「制御構文」です。
内容がやや多いため、2回のパートに分けて掲載します。今回はPart1です。
本連載の初回および章立ての一覧については下記のリンクから確認できます。
解説動画
2023/12/11 解説動画を掲載しました。
4-1 制御構造
制御構造は、プログラムを構成する処理の流れのことで「順次」「分岐」「反復」の3つがあります。
- 順次:命令を上から順に実行する。
- 分岐:条件に基づき、実行する命令をいずれかに決定する。
- 反復:条件に基づき、同じ命令をくり返す。
制御構文は、このうち分岐と反復を実現する構文です。Javaにおける構文には次のようなものがあります。
- 分岐:if文、switch文
- 反復:while文、do-while文、for文
早速これらの構文についてご紹介したいところですが、制御構文を扱うためには条件式を理解する必要があります。次節ではまず、条件式について学習します。
4-2 条件式と演算子
条件式とは、演算結果がboolean型(true
またはfalse
)と評価される式のことです。true
とfalse
は簡単に言えばYesかNoです。
4-2-1 比較演算子
比較演算子は2つの値を比較するための演算子です。演算結果はboolean型と評価されるため条件式を構成できます。主な比較演算子を下表に示します。
演算子 | 条件式の例 | 例の意味 |
---|---|---|
== | a == 5 | aと5は等しい |
!= | a != 5 | aと5は異なる |
<= | a <= 5 | aは5以下である |
>= | a >= 5 | aと5以上である |
< | a < 5 | aは5より小さい |
> | a > 5 | aは5より大きい |
- aは変数であることを示しています。
- 条件式の内容が正しければ
true
、そうでなければfalse
となります。
プログラム例を示します。
プログラム例
public class Main{ public static void main(String[] args){ int a = 5; int b = 8; System.out.println(a == 5);//aは5である System.out.println(b != 8);//bは8ではない System.out.println(a < 5); //aは5より小さい System.out.println(a <= 5);//aは5以下である System.out.println(a > b); //aはbより大きい System.out.println(b >= a);//bはa以上である } }
実行結果
true false false true false true
解説
a == 5
は「aと5が等しい」です。変数aは5なのでtrue
となります。b != 8
は「bは8ではない」です。変数aは8なのでfalse
となります。a < 5
は「aは5より小さい」です。変数aは5なのでfalse
となります。a <= 5
は「aは5以下」です。変数aは5なのでtrue
となります。a > b
は「aはbより大きい」です。変数aは5、bは8なのでfalse
となります。b >= a
は「bはa以上」です。変数aは5、bは8なのでtrue
となり
4-2-2 論理演算子
論理演算子は複数の条件式を組み合わせて、さらに複雑な条件式を書くことができる演算子です。論理演算子には次の3つがあります。
記号 | 例 | 例の意味 |
---|---|---|
|| | a || b | aまたはbがtrue ならtrue |
&& | a && b | aもbもtrue ならtrue |
! | !a | aがfalse ならtrue |
- aとbは、boolean型と評価される値または式でなければいけません。
プログラム例を示します。
プログラム例
public class Main{ public static void main(String[] args){ int a = 5; int b = 8; //aが5 かつ bが7 ならtrueを表示 System.out.println( a==5 && b==7 ); //aが5 または bが7 ならtrueを表示 System.out.println( a==5 || b==7 ); //aが5 でなければtrueを表示 System.out.println( !(a==5) ); } }
実行結果
false true false
解説
- 各文の意味はコメントにあるとおりです。
&&
と||
は比較演算子よりも優先順位が低いため、2つの条件式を踏まえた判定 ができる式を作ることができます。!
は比較演算子よりも優先順位が高いため、a==5
を()
で囲んでいます。a==5
がtrue
ならfalse
、false
ならtrue
を表示します。
a==5 && b==7
の例で言えば、下図のようになります。4-2-3 文字列同士の比較
文字列(String)型同士を比較し、同じ文字列かどうかを判定することができます。文法は次のとおりです。
文字列1.equals(文字列2)
文字列1と文字列2が同一の文字列であれば、この記述はtrue
と評価されます。
プログラム例を示します。
プログラム例
public class Main{ public static void main(String[] args){ String str = "Apple"; //変数strと「Apple」を比較 System.out.println( str.equals("Apple") ); //変数strと「Banana」を比較 System.out.println( str.equals("Banana") ); //「Banana」と「Banana」を比較 System.out.println( "Banana".equals("Banana") ); } }
実行結果
true false true
解説
リテラルや変数など、String型と評価できるものであれば.equals(~)
の記述を使って文字列同士を比較できます。
4-3 if文
if文は分岐を実現する制御制御構文です。次の3つのブロックを使って構成します。if文の全体像を示します。
いくつかのパターンを使って、if文のプログラム例を説明します。
4-3-1 if文(ifブロックのみ)
始めにifブロックのみを使用するパターンです。
ifブロックの文法を示します。
if(条件式){ //条件式がtrueの場合の処理 }
ifブロックは・・・
- if文の最初に必須です。
- 記述できるのは1つだけです。
- 条件式が
true
の場合にブロック内の処理を実行します。
プログラム例を示します。
プログラム例
public class Main{ public static void main(String[] args){ int a = 6;//(1) if(a >= 5){ System.out.println("aは5以上です"); } System.out.println("プログラム終了"); } }
実行結果
aは5以上です プログラム終了
解説
ifブロックの条件式はa >= 5
となっています。つまり、aが5以上ならブロック内の処理を行います。例では変数aの値は6
なので、「aは5以上です」が表示されます。
また、(1)の行をint a = 4;
に変更すると実行結果は下記となります。
実行結果(aが4の場合)
プログラム終了
条件式a >= 5
がfalse
となるため、「aは5以上です」が表示されません。
4-3-2 if文(elseブロックの使用)
次にelseブロックを使用した例です。elseブロックを含む文法パターンを示します。
if(条件式){ //条件式がtrueの場合の処理 } else { //条件式がfalseの場合の処理 }
この文例では
- ifブロック内の条件式が
true
なら、ifブロック内の処理 - ifブロック内の条件式が
false
なら、elseブロック内の処理
を実行します。プログラム例を示します。
プログラム例
public class Main { public static void main(String[] args) { int a = 4; if( a >= 5 ) { System.out.println("aは5以上です。"); } else { System.out.println("aは5より小さいです。"); } System.out.println("プログラム終了"); } }
実行結果
aは5より小さいです。 プログラム終了
解説
条件式はa >= 5
なので変数aが5以上なら、ifブロック内の処理を実行します。ですが、変数aは4
なので条件式はfalse
となり、elseブロックの処理を実行します。
4-3-3 if文(else ifブロックの使用)
次にelse ifブロックを使用した例です。else ifブロックを使うと、ifブロックの条件がfalse
の場合に別の条件式を設定できます。
else ifブロックを含む文法パターンを示します。
if(条件式1){ //条件式1がtrueの場合の処理 } else if(条件式2) { //条件式2がtrueの場合の処理 }
この例の場合
- 条件式1が
true
ならifブロック内の処理 - 条件式1が
false
で、条件式2がtrue
ならelse ifブロック内の処理
を行います。プログラム例を示します。
プログラム例
public class Main { public static void main(String[] args) { int a = 4; if( a >= 5 ) { System.out.println("aは5以上です。"); } else if( a == 4 ) { System.out.println("aは4です。"); } System.out.println("プログラム終了"); } }
実行結果
aは4です。 プログラム終了
解説
- ifブロックの条件式は
a >= 5
ですが、変数aは4
なのでこの条件式の結果はfalse
となります。 - 次にelse ifブロックの条件式を判定します。条件式は
a == 4
です。変数aは4
なので条件式はtrue
となり、「aは4です。」 が表示されます。
4-3-4 多数の条件分岐
if文を構成する3つのブロックをつなげていくことで、多数の条件分岐を実現できます。プログラム例を示します。
プログラム例
public class Main { public static void main(String[] args) { int a = 8; if(a >= 10){ System.out.println("aは10以上"); } else if(a % 2 == 0){ System.out.println("aは偶数です"); } else if(a == 5){ System.out.println("aは5です"); } else{ System.out.println("aは上記以外です"); } } }
実行結果
aは偶数です。
解説
次の順番で動作します。
- ifブロックの条件式
a >= 10
を判定します。判定結果はfalse
となります。 - 次にelse ifブロックの条件式
a % 2 == 0
を判定します。判定結果はtrue
となり、このelse ifブロック内の処理が実行されます。 - 以降のelse ifブロック、elseブロックは処理されずプログラムが終了します。
一連のif文において、2つ以上のブロック内の処理は行なわれません。あくまで「どれか1つの処理に決める」イメージです。
4-4 switch文
switch文は値によって分岐を実現する、シンプルな分岐構文です。
switch(式){ case 値1: //式が値1の場合の処理 break; case 値2: //式が値2の場合の処理 break; : default: //式がいずれの値でもない場合の処理 break; }
- 式の値が、caseの値のいずれかに該当するとその位置まで処理がジャンプします。
break;
はブロックを抜ける命令です。実行されるとswitchブロックの次へ移ります。- 式の評価結果とcaseの各値の型は一致させる必要があります。
- 評価結果として使える方にはint、char、Stringなどがあります。
プログラム例を示します。
プログラム例
public class Main { public static void main(String[] args) { int value = 1; switch(value) { case 0: System.out.println("大吉"); break; case 1: System.out.println("中吉"); break; case 2: System.out.println("小吉"); break; default: System.out.println("凶"); break; } } }
実行結果
中吉
解説
- switch文の式は
value
となっています。valueの値は1
なので、case 1:
に処理がジャンプします。 - 画面に「中吉」が表示されます。
break;
が実行されることでswitch文を抜け、処理が終了します。
次にswitch文で陥りやすいポイントをご紹介します。プログラム例を示します。
プログラム例
public class Main { public static void main(String[] args) { int value = 1; switch(value) { case 0: System.out.println("大吉"); break; case 1: System.out.println("中吉"); case 2: System.out.println("小吉"); break; default: System.out.println("凶"); break; } } }
実行結果
中吉 小吉
解説
1つ前のプログラム例から、10行目のbreak;
を削除しただけのものです。switchブロック内は該当するcase
に移動した後、break;
に到達するまで、(case 2:
の記述などは関係なく)処理が上から順番に実行されます。したがって、「中吉」と「小吉」が表示されてしまいます。case 値:
の記述自体はあくまでジャンプ地点を示すラベルのようなもので、処理を分岐させるものでは無い点に注意が必要です。
case 値:
の記述は、caseラベルと言います。