C言語やJava言語などどのプログラミング言語でも,条件文が存在する.条件文とは,条件次第で実行するかしないか,あるいは条件次第で実行する文を切り替えるために使用される文である.C言語やJavaでは次のふたつが用意されている.
if文は次のような構文である.
if(条件式) { 条件式が真(true)だった時に実行される部分 } else { 条件式が偽(false)だった時に実行される部分 }
括弧内の条件式の結果が真(true)か偽(false)によって動作が分岐して,条件式の結果次第でどちら一方だけを実行する.条件式が真になることを「条件(式)が成立する」と表現する.
「else」以下は必要なければ省略することもできる.また,条件が成立した時,しなかった時に実行される部分が実行文ひとつだけの場合には,中括弧を省略することもできる.
条件が成立したとき,しないときに実行する部分には,さらに別のif文を書くこともできる.これにより複雑な条件分岐を記述することができる.
if(条件式1) { if(条件式2) { 実行部分A } else { 実行部分B } } else{ if(条件式3) { 実行部分C } else { 実行部分D } }
この例では,次のように動作し,4つの実行部分(A,B,C,D)のうちひとつだけ実行が行われる.(他は実行されない)
ここで実行部分といっているのは,複数の実行文(代入文やif文やswitch文など)を含んで良い.
複数のif文を使ってよく書かれるプログラム例が次のような連続的なif文である.
if(条件式1) { 条件式1が成立したときの実行部分 } else if(条件式2) { (条件式1が成立せず)条件2が成立したときの実行部分 } else if(条件式3) { (条件式1と条件式2が成立せず)条件式3が成立したときの実行部分 } else { 条件式1も2も3も成立しないときの実行部分 }
この例は,最初に説明したように,各elseのところの実行文が次のif文ひとつだけなので,中括弧を省略して書いてある.省略せずに書けば,本来は次のような意味である.(省略しない方が逆に読みにくく,書くのも面倒なので普通はこうは書かない)
if(条件式1) { 条件式1が成立したときの実行文 } else { if(条件式2) { (条件式1が成立せず)条件式2が成立したときの実行文 } else { if(条件式3) { (条件式1と条件式2が成立せず)条件式3が成立したときの実行文 } else { 条件式1も2も3も成立しないときの実行文 } } }
先ほどの連続したif文はよく使われるが,その連続したif文は次のようにある変数の値別に実行文を切り替えたい時に,一番よく使われる.
if(x==定数1) { xが値1だったときの実行文 } else if(x==定数2) { xが値2だったときの実行文 } else if(x==定数3) { xが値3だったときの実行文 } else { xがそれ以外の値だったときの実行文 }
この例では変数xの値を調べて,その値がどの定数と等しいかによって実行文を切り替えるためのプログラムである.もちろん変数xに名前は自分の都合によって任意の名前のものであって構わない.値1,値2,値3にも調べたい値を具体的な定数として書く.例えば0と-1と100などの定数である.
この例を簡単にわかりやすいように表記するためにswitch文が用意されている.先の例とまったく等価なプログラムを次のように書くこともできる.
switch(x) { case 値1: xが値1だったときの実行部分 break; case 値2: xが値2だったときの実行部分 break; case 値3: xが値3だったときの実行部分 break; default: xがそれ以外の値だったときの実行文 }
このswitch文の例は,if文で書いたものと同じで,変数xの中身が,値1,値2,値3のどれかに等しい場合,どれかの実行部分を一つだけ選択して実行する.(他は実行しない)
switch文の注意点は次のとおりである.
xの変数名は,もちろんどの変数を調べたいかによって変更してよい.また,変数だけでなく,一般的な計算式を書くこともできる.その場合,計算式の計算結果が,値1,値2,値3のどれに等しいかによって実行文を切り替えることになる.
switch(計算式) { case 値1: 計算結果が値1だったときの実行文 break; case 値2: 計算結果が値2だったときの実行文 break; case 値3: 計算結果が値3だったときの実行文 break; default: 計算結果がそれ以外の値だったときの実行文 }
各caseには,breakが必要だと書いた.このbreakは,そのcaseを終了し,switch文を終了してswitch文の中から脱出することを意味する.逆にいえば, break文を書かないと,その下に書かれた実行部分までそのまま実行されてしまう.
このbreak文は,つまりif文においての中括弧の代わりのように,どこまでがそのcaseの実行部分なのか範囲を示すものである.中括弧を使わず,わざわざbreakと書くのは,次のように複数のcase文を連結して使用することがあるためである.
switch(x) { case 値1: case 値2: ※xが値1または値2だったときの実行部分 break; case 値3: xが値3だったときの実行部分 break; default: xがそれ以外の値だったときの実行文 }
この例の場合,もしもxが値1だった場合でも,値1のcaseがbreakで終了していないため,そのまま下のcase文まで実行されるため.結果として※部分が実行される.そして値2だった場合にも通常どおり※部分が実行されるため,値1であっても値2であっても,結局※部分が実行されることになる.これ を利用して,「値1または値2であった場合」を記述することができる.