if-then文
基本形
if-then文は以下のようにif
キーワード、(boolean
式)、1つの文が並べられた文で、boolean
式がtrue
の場合に文が実行される。
if (boolean式) 文;
1 2 3 4 5 |
int r = new java.util.Random().nextInt(); if (r % 2 == 0) System.out.println(r + " is even"); // 2145498072 is even |
キーワードから見るとif文となるが、Oracleの仕様書を尊重してif-then文としておく。
改行した場合
実行文の前で改行しても同じように実行される。
1 2 3 4 5 6 |
int r = new java.util.Random().nextInt(); if (r % 2 == 0) System.out.println(r + " is even"); // 1063598367 is odd |
エラープローン
if-then文で改行して複数の文を書いた場合、条件式直後の1文しか条件の判定結果に含まれない。以下の例ではfalse
で1つ目の分は無視されるが、その直後の文に制御が移って実行される(インデントは効果がない)。
1 2 3 4 5 |
if (false) System.out.println("1st line"); System.out.println("2nd line"); // 2nd line |
当初簡易化のために改行形で書いていて、後から条件の対象となる文をそのまま付け加えた時、意図したロジックと異なる動作をしてしまう可能性がある。
一般形
上のようなトラブルを回避するため、一般にはif
命令の後の文を{}
で囲んでブロックとする。
if (...) { ..... }
1 2 3 4 5 6 7 |
int r = new java.util.Random().nextInt(); if (r % 2 == 0) { System.out.println(r + " is even"); } // 590678292 is even |
if-then-else文
基本形
if-then-else文は以下のようにif
キーワード、(boolean
式)、文1、else
キーワード、文2が並べられた文で、boolean
式がtrue
の場合に文1が、false
の場合には文2が実行される。
if (boolean式) 文1 else 文2;
1 2 3 4 5 |
int r = new java.util.Random().nextInt(); if (r % 2 == 0) System.out.println(r1 + " is even"); else System.out.println(r1 + " is odd"); // 40803669 is odd |
改行した場合
文1の前、else
の前、文2の前で改行しても、文2の終わりまでが1つのif-then-else文として扱われる。
1 2 3 4 5 6 7 8 |
int r = new java.util.Random().nextInt(); if (r % 2 == 0) System.out.println(r + " is even"); else System.out.println(r + " is odd"); // 254298844 is even |
エラー
以下のコードはコンパイルエラーになる。
1 2 3 4 5 |
if (false) System.out.println("1st line"); System.out.println("2nd line"); else System.out.println("3rd line"); |
これは、以下の理由による
- if-then文に属するのは
"1st line"
の文だけ - その後、if-then文の外側として
"2nd line"
の文が実行される - これに続く
else
には、それが属するべきif
文がなく、if-else
文ではないのにelse
単独で存在 - よって構文エラー
一般形
上記のようなエラーを避け、またif文であったようなトラブルを避けるためにも、if-else
文においても{}
によるブロック表記が一般的。
if (...) { ..... } else { ..... }
1 2 3 4 5 6 7 8 9 |
int r = new java.util.Random().nextInt(); if (r % 2 == 0) { System.out.println(r + " is even"); } else { System.out.println(r + " is odd"); } // 1529328115 is odd |
else if
Javaの仕様上、Pythonのelif
、Rubyのelsif
、PHPのelseif
に相当するキーワードはない。
これらと同等のロジックを組むために一般的には”else if
“という表現がされているが、これを適切に扱うにはブロックとして扱うべきである。これについて”Java仕様における”Java – if文をブロック化すべき理由とelse if“に示した。