if文制御
条件ステートメント
ここでは、プログラムの条件分岐を覚えましょう
ifステートメントは条件ステートメント、もしくは選択ステートメントなどと呼ばれる種類のステートメントです
if文は制御文の中でも最も単純なステートメントで指定ステートメントを実行するか否かを判定します
if (expr) statement;
exprには実行するか否かを評価する条件式を指定します
exprが返す結果は、必ずboolean型である必要があります
JavaのifステートメントはTrueかFalseか(真か偽か)で評価され、その結果が真の場合のみstatementを実行します
条件式で用いられるのは、二つの値を比較する関係演算子を使います
演算子については演算子一覧をご覧ください
次のプログラムは一つの変数の値を評価します
整数型の変数varが10である場合とそうでない場合の処理を実行します
class test {
public static void main(String args[]) {
int var = 10;
if (var == 10) System.out.println("変数varは10です");
if (var != 10) System.out.println("変数varは10ではありません");
}
}
(var == 10) はvarが10であったときの処理を
(var != 10) はvarが10でなかったときの処理を指定しています
elseステートメント
if文に対してelseステートメントを追加することによって、より柔軟な分岐が可能になります
elseステートメントは直前のifが偽の場合に指定ステートメントを実行します
直前のifが真であればelseステートメントは実行されません
つまり、ifとelseを用いて完全な二者択一分岐を簡単に作ることができます
先ほどのプログラムをelseステートメントを用いて書き換えてみましょう
class test {
public static void main(String args[]) {
int var = 10;
if (var == 10) System.out.println("変数varは10です");
else System.out.println("変数varは10ではありません");
}
}
得られる結果は同じですが、elseは式を評価しない分合理的といえます
コードブロック
ifやelseで実行するステートメントが複数ある場合の処理を考えます
Java言語では複数のステートメントをブロックとしてグループ化できます
このステートメントのグループをコードブロックと呼びます
{
statement1;
statement2;
statementn......
}
コードブロックは { } で複数のステートメントをまとめてしまいます
そうすることによって、コードブロックで囲まれたグループは論理的には1つのステートメントという単位で扱えます
ifやelseなどの制御文で、複数のステートメントを指定するにはコードブロックを直接指定すればよいのです
class test {
public static void main(String args[]) {
int var = 10;
if (var == 10) {
System.out.println("if文が実行されました");
var = 100;
}
System.out.println("変数varの値 = " + var);
}
}
条件式が真であれば、コードブロックが実行されます
これで複数のステートメントをif文の実行単位にすることが可能になります
もちろんelseステートメントなど、if文以外でも実用することができます
ifステートメントのネスト
ifステートメントの対象にifが使われるような、ある命令に同種の命令が使われるのをネスト(入れ子)といいます
ifステートメントはその対象にまたifを使うことができます
簡単な例を見てみましょう
class test {
public static void main(String args[]) {
int var = 10;
if (var > 5)
if (var < 15) System.out.println("varは5より大きく15より小さいです");
else System.out.println("varは15より大きいです");
else System.out.println("varは5より小さいです");
}
}
elseの位置が少しややこしいですが、elseは関連するelseがまだない直前のifに対して働きます
落ち着いてみればわかると思います
ネストの対象をコードブロック単位で行うことも同様に可能です
さらに高度な(?)ネストでif-else-ifのラダー(はしご)を作ることも可能です
ifで評価して、elseの対象をまたifにする、これを繰り返します
class test {
public static void main(String args[]) {
int var = 0;
if (var < 5) System.out.println("varは5以下です");
else
if (var > 15) System.out.println("varは15以上です");
else System.out.println("varは5以上15以下です");
}
}
このプログラム例では、まだインデントが浅いのでよいですが
深くなりすぎると読みづらくなってしまうため、通常は以下のような記述をします
(結果は同じですが、多くのプログラマが共通してこのような書き方をするので統一しましょう)
class test {
public static void main(String args[]) {
int var = 0;
if (var < 5) System.out.println("varは5以下です");
else if (var > 15) System.out.println("varは15以上です");
else System.out.println("varは5以上15以下です");
}
}
これなら、どんなに繰り返しても読みづらくなるようなことはありません
ラダーの場合、全てが偽であれば最後のelseが実行され
全てが偽で最後にelseを指定しなかった場合は何も実行されません
これは、ifのラダーの基本なので覚えておきましょう
if (expr) statement ; [else e-statement]
式の評価が真であればstatementを実行します
偽の場合でelseが指定してあればe-statementを実行します
expr - 必ず指定します。評価する式を指定します
statement - 評価が真のときに実行する単体ステートメントを指定します
e-statement - 省略可能です。評価が偽のときに実行する単体ステートメントを指定します