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>
次のような構文も用意されています:
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年は閏年ではありません。