if

last-modified: May/11th/2003; Since: Dec./23rd/2001

条件分岐の代表として、 if 文を紹介します。

基本構文

条件式を与えて、その条件式が真であればブロックAを、偽であればブロックBを実行します。

if (条件式) {
	ブロックA
} else {
	ブロックB
}

else 以下は省略可能です。その場合は、条件式が真であればブロックAを実行しますが、偽であれば何もせずに次の行へ制御が進みます。

サンプル

IfDemo.java:

class IfDemo {
	public static void main(String[] args) {
		int i = 10;
		int j = 5;
		System.out.println("Before");
		if (i <= j) {
			// ブロックA
			System.out.println("Win!");
		} else {
			// ブロックB
			System.out.println("Loose!");
		}
		System.out.println("After");
	}
}

上の例では、変数 i に代入された値が j の値以下であればブロックAが実行され、さもなくばブロックBが実行されます。この場合はブロックBが実行される事になります。

C:\Java>javac IfDemo.java
C:\Java>java IfDemo
Before
Loose!
After
C:\Java>

基本構文その2

次のような構文も用意されています:

if (条件1) {
	ブロックA
} else if (条件2) {
	ブロックB
} else if (条件3) {
	ブロックC
} else {
	ブロックD
}

else if() のブロックは幾つあっても構いません。また、最後の else ブロックは省略可能です。

この構文では、条件2と条件3の両方に合致する場合でも、条件2のブロックしか実行されません。条件式のブロックを記述する順番を間違えると、正しく働きませんので、注意が必要です。

サンプル

コマンドラインから引数を一つとります。これを、条件式で 123 と比較して、大きい/小さい/等しいで条件分岐しています。

IDCheck.java:

class IDCheck {
	public static void main(String[] args) {
		// コマンドライン引数を int 型に変換
		int i = Integer.parseInt(args[0]);
		// i と 123 の比較
		if (i == 123) {
			System.out.println("ビンゴ!");
		} else if (i < 123) {
			System.out.println("足りない!");
		} else {
			System.out.println("多すぎ!");
		}
	}
}

Integer.parseInt() は、 Integer クラスのメソッドで、引数にとった文字列を int 型に変換して解釈します。今の場合は、文字列型変数 args[0] に代入された文字列を int 型と解釈して 123 と比べています。

コマンドライン:

C:\>cd java
C:\java>javac IDCheck.java
C:\java>java IDCheck 100
足りない!
C:\java>java IDCheck 200
多すぎ!
C:\java>java IDCheck 123
ビンゴ!
C:\java>

引数を与えなかったり、二つ以上の引数を与えた場合は、実行時エラー(例外、 Exception)が発生します。折角ですから、コマンドライン引数の個数で条件分岐して、エラーメッセージを用意しておきましょう。

class IDCheck {
	public static void main(String[] args) {
		if (args.length != 1) {
			System.out.println("引数を一つ入力してください。");
		} else {
			int i = Integer.parseInt(args[0]);
			if (i == 123) {
				System.out.println("ビンゴ!");
			} else if (i < 123) {
				System.out.println("足りない!");
			} else {
				System.out.println("多すぎ!");
			}
		}
	}
}

args.length は、配列を参照する変数 args が参照している配列の要素の個数を int 型の値として返します。今の場合は、コマンドライン引数の個数が1つ以外である場合は制御が if ブロックに移り、一つであれば else ブロックに移ります。

if 構造を追加して、目的の値から10以内ならば「ちょっと大きい!」、「ちょっと小さい!」と表示するようにソースを編集/保存して、コンパイル/実行してみてください。

サンプル

引数から西暦を受け取り、閏年であるかどうかを判定します。閏年の条件は次のように決めます:

class Uruu {
	public static void main (String[] args) {
		if (args.length!=1) {
			System.out.println("西暦を入力してください。");
			return;
		}
		// String 型のコマンドライン引数 args[0] を int 型に変換
		int year = Integer.parseInt(args[0]);
		boolean bln = false;
		if (year%4 == 0) {          	//4で割り切れる
			bln = true;
			if (year%100 == 0) {    	//100で割り切れる
				bln = false;
				if (year%400 == 0) { 	//400で割り切れる
					bln = true;
				}
			}
		} else {
			// false で初期化しているので不要
			bln = false;
		}
		if (bln) {
			System.out.println(args[0] + "年は閏年です。");
		} else {
			System.out.println(args[0] + "年は閏年ではありません。");
		}
	}
}

% は除算の余りを返す演算子です。

Integer.parseInt(args[0])String 型の変数 args[0] に代入されている値を int 型として解釈した値を返します。返された値は左辺の int 型変数 year に代入されています。

C:\Java>javac Uruu.java
C:\Java>java Uruu 2000
2000年は閏年です。
C:\Java>java Uruu 2001
2001年は閏年ではありません。
C:\Java>java Uruu 2004
2004年は閏年です。
C:\Java>java Uruu 2100
2100年は閏年ではありません。

これは最も単純な書き方ですが、少し考えると、もっと簡略化することができます。閏年でない条件は、「4で割り切れない」または(「100で割り切れる」かつ「400で割り切れない」)です。したがって、次のように記述できます

class Uruu2 {
	public static void main(String[] args) {
		if (args.length != 1) {
			System.out.println("西暦を一つ入力してください。");
		}
		int year = Integer.parseInt(args[0]);
		if (year%4 != 0 || (year%100 == 0 && year%400 != 0)) {
			System.out.println(args[0] + "年は閏年ではありません。");
		} else {
			System.out.println(args[0] + "年は閏年です。");
		}
	}
}

||&& は、それぞれ論理和(又は)と論理積(且つ)のショートサーキット演算子です。

C:\Java>javac Uruu2.java
C:\Java>java Uruu2 2000
2000年は閏年です。
C:\Java>java Uruu2 2001
2001年は閏年ではありません。
C:\Java>java Uruu2 2004
2004年は閏年です。
C:\Java>java Uruu2 2100
2100年は閏年ではありません。


Copyright © 2001-2003 SUGAI, Manabu. All Rights Reserved.