制御構文
全てのアルゴリズムは可読性はともかくとしても条件分岐文と繰り返し文を使うことで実装できます。
Javaでは条件分岐文としてはif文とswitch文を、繰り返し文としてはfor文とwhile文をサポートしています。
ここでは今後の学習に必要な範囲で解説します。
このあたりの解説に関しては深く学ぼうとすればそれなりの量がありますが、ここでは実用レベルの解説にとどめます。
条件式
条件式(Conditional Expression)とは、条件分岐や繰り返し処理の終了などのなんらかの条件を示すものでboolean値を返す式です。
比較演算子を用いた数式、またはboolean値を返すメソッドなどが条件式となりえます。
条件式の組合せ
条件式同士は&&演算子(かつ)と||演算子(または)を用い結合することが可能です。
&&演算子は両方の条件式が共にtrueの場合にtrueとなります。
この時左辺がfalseであったならば右辺の判定を行わないのが特徴です。
x | y | x && y | yの評価 |
---|---|---|---|
true | true | true | 有 |
true | false | false | 有 |
false | true | false | 無 |
false | false | false | 無 |
演算子はどちらかの条件式がtrueの場合にtrueとなります。 |
こちらも左辺がtrueであったならば右辺の判定を行いません。
x | y | x || y | yの評価 |
---|---|---|---|
true | true | true | 無 |
true | false | true | 無 |
false | true | true | 有 |
false | false | false | 有 |
if文
if文は条件分岐を実現する構文で、条件式と共に用います。
if(条件式1) { // 処理1 } else if(条件式2) { // 処理2 } else { // 処理3 }
if文にプログラムの実行が移ると、最初の条件式(条件式1)が判定されます。
結果がtrueであれば、直後のスコープにある処理を行い残りの処理をスキップして後続の処理が行われます。
結果がfalseであれば、次の条件式(条件式2)が判定され、trueならば処理2が実行され後続の処理に移ります。
条件式の結果が全てfalseの場合、else文の直後のスコープにある処理(処理3)が実行されます。
尚、else if句、else句は省略することができます。
[例1]
int x = 10; if(x < 10) { // xが10未満の場合 }
[例2]
int x = 10; int y = 0; if(0 < x && 0 < y) { // xとyが共に正の場合 } else { // それ以外の場合 }
[例3]
int x = 10; if(x < 0) { // xが負の場合の処理 } else if(x == 0) { // xが0の場合の処理 } else { // xが正の場合の処理 }
switch文
switch文はコードの可読性が低くなり奨励されませんので解説を省略します。
while文
while文は特定の条件を満たすまで繰り返し処理を行う構文です。
while(条件式) { // 処理 }
条件式がtrueである限り、処理が繰り返し行われます。
条件式が最初からfalseであるならば、処理は1回も行われません。
[例1]
int x = 0; // 10回のループ while(x < 10) { // 処理 // xのカウントアップ x++; }
[例2]
// 数列 X[i+1] = 2*X[i] + 3 で10,000以下で最大の値を調べる int x = 0; // 10,000以下である間ループ while(x < 10000) { x = (2 * x) + 3; }
for文
for文はwhile文に似ていますが、変数の初期化と処理後の更新処理を記述できます。
規定回数のループを行いたい場合などは、一般的にfor文を使用します。
for(初期化処理; 条件式; 更新処理) { // 処理 }
初期化処理はfor文の実行時に1回だけ処理され、条件式が判定しtrueならば処理が実行されます。
その後、処理の実行後に更新処理が行われ、再び条件式の判定となります(以下、繰り返し)。
[例1]
// 10回のループ for(int x = 0; x < 10; x++) { // 処理 }
これはwhile文の例1とほぼ同じ動きをします。
異なるのはxの初期化の位置がfor文の中となる為、xのスコープ(有効範囲)はfor文の中のみになると言う事です。
また、xのインクリメント処理もfor文の中に含まれる為、コードが読みやすいと言えます。
このように規定回数処理を繰り返す場合は、for文を使用するのが一般的です。
[例2]
// 数列 X[i+1] = 2*X[i] + 3 で10,000以下で最大の値を調べる for(int x = 0; x < 10000; x = (2 * x) + 3) { }
このコードはwhile文の[例2]とほぼ同じ動きをします。
しかし、xはfor文の中でしか有効ではありませんから、for文の後でxの値を使うことができません。
また、更新処理が x = (2 * x) + 3 と少々複雑になっています。
このような場合はfor文はあまり使用すべきではないケースといえます。
また、初期化処理と更新処理は省略することもできますが、どちらも省略した場合はwhile文と変わりませんのでwhile文を使用すべきでしょう。
無限ループ
for文でもwhile文でも条件式が常にtrueであれば、繰り返し処理を抜けることがありません。
このようなループを無限ループと呼び、無限ループが発生するとプログラムは強制終了してしまいます。
[条件式にtrue]
while(true) { // 処理 }
[条件が常にtrue]
for(int x = 0; 0 <= x; x++) { // 処理 }
beak文
break文は主にfor文とwhile文で使用される構文です。
for文やwhile文でbreak文を使用するとそのブロックを抜けることができます。
特定の条件で繰り返し処理を中断したい場合にif文と組み合わせて使用することが多いでしょう。
[例1]
int x = 0; // 100回のループ for(int i = 0; i < 100; i++) { // 処理1 x = 7 * x + i; if(100 < x) { break; } // 処理2 }
この例では最大で100回のループを行うように実装されていますが、xが100を超えたならば処理を中断してループを強制的に抜けています。