制御構文は同一もしくは異なる複数の構文を入れ子(ネスト)することにより、複雑な流れのプログラムを作成することができます。
制御文のネスト例
制御構文のネストの形は決まっているわけではありませんが、代表的な例を紹介します。
条件分岐内の条件分岐
条件分岐の中に条件分岐を入れ子にします。
条件分岐の入れ子が多すぎるとプログラムの可読性が落ちる場合もあるので、多用は禁物です。
以下はifの中にifをネストした例です。
1 2 3 4 5 6 7 |
int month = 1; int date = 1; if(month == 1){ if(date == 1){ System.out.println("元旦です"); } } |
上記のifは以下のような論理演算子を利用することでも同じ処理になります。
if(month == 1 && date== 1)
多重ループ
ループ処理をネストすることにより、複雑な反復処理を行うことができます。
2重ループ(2つのループ処理をネスト)ぐらいだと流れは追いやすいですが、場合によっては3重よりも多いループを使うこともあります。
ネストされたループ中の処理回数は、足し算ではなく掛け算となります。5回ループするforを2つネストした場合は、10回の処理ではなく25回処理されることになります。
以下はforの中にforをネストした例です。
1 2 3 4 5 6 |
for(int i = 0; i < 2; i++){ for(int j = 0; j < 3; j++){ System.out.print("■"); } System.out.println(); } |
以下をクリックすると、上記プログラムの解説が表示されます。
順序 | 動作 | 動作するfor | 補足 |
---|---|---|---|
1 | int i = 0 | 外側 | iを0で初期化 |
2 | i < 2 | 外側 | i(0) < 2の比較でtrue |
内側ループ開始 | |||
3 | int j = 0 | 内側 | jを0で初期化 |
4 | j < 3 | 内側 | j(0) < 3の比較でtrue |
5 | Sysout(“■”) | 内側 | ■を表示 |
6 | j++ | 内側 | jがインクリメントされ1になる |
7 | j < 3 | 内側 | j(1) < 3の比較でtrue |
8 | Sysout(“■”) | 内側 | ■を表示 |
9 | j++ | 内側 | jがインクリメントされ2になる |
10 | j < 3 | 内側 | j(2) < 3の比較でtrue |
11 | Sysout(“■”) | 内側 | ■を表示 |
12 | j++ | 内側 | jがインクリメントされ3になる |
13 | j < 3 | 内側 | j(3) < 3の比較でfalse |
内側ループ終了 | |||
14 | Sysout() | 外側 | 改行 |
15 | i++ | 外側 | iがインクリメントされ1になる |
16 | i < 2 | 外側 | i(1) < 2の比較でtrue |
内側ループ開始 | |||
17 | int j = 0 | 内側 | jを0で初期化 |
18 | j < 3 | 内側 | j(0) < 3の比較でtrue |
19 | Sysout(“■”) | 内側 | ■を表示 |
20 | j++ | 内側 | jがインクリメントされ1になる |
21 | j < 3 | 内側 | j(1) < 3の比較でtrue |
22 | Sysout(“■”) | 内側 | ■を表示 |
23 | j++ | 内側 | jがインクリメントされ2になる |
24 | j < 3 | 内側 | j(2) < 3の比較でtrue |
25 | Sysout(“■”) | 内側 | ■を表示 |
26 | j++ | 内側 | jがインクリメントされ3になる |
27 | j < 3 | 内側 | j(3) < 3の比較でfalse |
内側ループ終了 | |||
28 | Sysout() | 外側 | 改行 |
29 | i++ | 外側 | iがインクリメントされ2になる |
30 | i < 2 | 外側 | i(2) < 2の比較でfalse |
■ ■ ■
■ ■ ■
上の図解は2重ループの例です。以下のような外側と内側のループを繰り返す流れになっています。(番号は図解と連動してます。)
- 外側のループが始まり(①)
- 内側のループが行われ(②)
- また外側のループに戻る(③)
その他のネスト
ifの中にwhile(条件に合致した際にループを回す)や、forの中にif(ループ処理内部で条件に合致した場合に処理を行う)を入れる、といったように様々な形があります。
色々な構文の組み合わせがあるので、他の人が書いたプログラムもたくさん読んで参考にしましょう。
まとめ
- 制御文の中に制御文を記述することを「制御文の入れ子」や「制御文のネスト」と表現する
- 制御文のネストの形は様々