if文
if文(イフぶん)は、プログラミング言語において、真理値に従って「もしXならば、Yせよ、さもなくばZせよ」というような条件実行の「文 (プログラミング) 」で、制御構造のひとつである。if else文と呼ばれることもある。
具体的な構文はプログラミング言語によって異なるが一般的に、条件式と、条件式の評価結果の値が「真として扱うべき値」の場合に実行される「then節」と呼ばれる部分があり、「偽として扱うべき値」の場合に実行されるelse節と呼ばれる部分が付く場合もある。
then節とelse節が式になる「条件演算子」がある言語も多い。言語によってはifが文ではなく、条件演算子と同様の「if式」である言語もある。
真偽値[編集]
「真として(あるいは、偽として)扱うべき値」について詳説する。条件式の値が真理値をとるブーリアン型でなければならない言語もあるが、そのように限定していない言語もある。C言語にはそもそもブーリアン型が無くintで代用しているが、条件式としては汎整数型のゼロ(0)の他、ヌルポインタや 0.0 なども偽として扱われる。Rubyではnilとfalse以外は真として扱われる。JavaScriptにはtruthyとfalsyという用語があり、falseの他いくつかの値がfalsyで、その他の多くの値はtruthyである。比較的少数の偽になる値の他は、真、という言語が多いが、それと逆に、Dart言語(のproduction mode)のようにtrue以外は偽という言語もある(checked modeではbool以外の型だとエラー)。
構文と構文以外[編集]
以下ではいくつかの言語における、if文、乃至それに類似したものの、構文(syntax)と、構文以外のことについて述べる。
C[編集]
条件式は任意の式である(C99以前には真理値のみを扱うための型は無かった)。整数値0となる値は偽、他の値は真として扱われる。真を代表して表すための値は整数値1である。then節とelse節には、1個の文か、{ } で囲まれる複文を書く。
真の時だけ実行するとき
if (条件式)
then節
真と偽の両方に振り分けるとき
if (条件式)
then節
else
else節
Lisp[編集]
Lispでは、ifは関数のような見掛けだが実引数が評価されない特殊形式(マクロ)である。真偽値は、nil
という名前や中身の無いカッコ ()
で表現される空リストが偽として扱われ、他の値は真として扱われる。then節とelse節のどちらも式である。
真の時だけ実行するとき
(if 条件式 then節)
真と偽の両方に振り分けるとき
(if 条件式 then節 else節)
Lispにはcondという、同等の機能を実現できる特殊形式もある。仕様や実装によっては、ifがcondに展開されるマクロのこともあるし、condがifに展開されるマクロのこともある。
Pascal[編集]
then節とelse節には、1個の文か、begin
~end
で囲まれる複文を書く。
真の時だけ実行するとき
if 条件式 then
then節
真と偽の両方に振り分けるとき
if 条件式 then
then節
else
else節
Ada[編集]
Adaでは条件式の型はBoolean
(もしくはBoolean
の派生型)でなければならない。これはJava等も同様である。
真の時だけ実行するとき
if 条件式 then
then節
end if;
真と偽で実行文を変えるとき
if 条件式 then
then節
else
else節
end if;
Perlの場合[編集]
真の時だけ実行するとき
真文 if 条件文
偽の時だけ実行するとき
偽文 unless 条件文
また、C言語風の記述法も可能である。
真の時だけ実行するとき
if(条件文) {
真文
}
真と偽で実行文を変えるとき
if(条件文) {
真文
} else {
偽文
}
Rubyの場合[編集]
Rubyのifは厳密に言えばif式であり、条件が成立した方の節で最後に評価された式の値を返す。
真の時だけ実行するとき
if 条件式 (then)
真文
end
真と偽で実行文を変えるとき
if 条件文 (then)
真文
else
偽文
end
BASICの場合[編集]
真の時だけ実行するとき
IF 条件式 THEN 真文
真と偽で実行文を変えるとき
IF 条件式 THEN 真文 ELSE 偽文
真文・偽文が1行で書ききれない場合はgoto文が併用される。
Visual Basicの場合[編集]
真の時だけ実行するとき
If 条件式 Then
真文
End If
真と偽で実行文を変えるとき
If 条件式 Then
真文
Else
偽文
End If
真文・偽文が短い場合には BASIC と同様の書き方も可能である。
REALbasicの場合[編集]
真の時だけ実行するとき
If 条件式 Then 真文 End If
真と偽で実行文を変えるとき
If 条件式 Then 真文 Else 偽文 End If
OpenOffice.org Calc,Libre Office Calc, Excel の場合[編集]
真の式だけ実行するとき
IF(条件式;真文;"")
真と偽で実行文を変えるとき
IF(条件式;真文;偽文)
ただしLibre Office Calc, Office 365ではさらに条件を追加することができ
IFS(条件式1, 真の場合1, 条件式2, 真の場合2, ..., 条件式127, 真の場合127) (条件式は厳しいものから並べる必要がある。)
IF文の入れ子構造と処理は同一である。ただし可読性が良い。
FORTRAN[編集]
以下は、Fortran77以降の、論理IF文の場合である。1行のみの場合
if(条件式) 真文
複数行にまたがる場合
if(条件式1) then
条件式1が真の場合ここから
ここまでのプログラムが実行される(複数行)
else if(条件式2) then
条件式2が真の場合ただしすでに条件式1が成り立っている場合は除くここから
ここまでのプログラムが実行される(複数行)
else
すべてのなかのいずれの条件にも当てはまらない場合ここから
ここまでのプログラムが実行される(複数行)
end if
Forthの場合[編集]
真の時だけ実行するとき
条件式 IF 真文 THEN
偽の時だけ実行するとき
条件式 NIF 偽文 THEN
真と偽で実行文を変えるとき
条件式 IF 真文 ELSE 偽文 THEN
または
条件式 NIF 偽文 ELSE 真文THEN
ひまわりの場合[編集]
真の時だけ実行するとき
もし、{条件式}ならば、( {処理} )
真と偽で実行文を変えるとき
もし、{条件式}ならば、( {処理} ) 違ったら、( {処理} )
HSPの場合[編集]
真の時だけ実行するとき
if 条件式 : 真文
真と偽で実行文を変えるとき
if 条件式 : 真文 : else : 偽文
また、Cのようにブレイスを用いることもできる。
if 条件式 { 真文 } else { 偽文 }
プログラム例[編集]
特に断りがない場合na
とnb
の大きい方をnc
に代入という意味である。
Cでの例[編集]
if(na > nb) {
nc = na;
} else {
nc = nb;
}
nc = (na > nb) ? na : nb
としても同じ事ができる。
Common Lisp での例[編集]
(if (> na nb)
(setq nc na)
(setq nc nb))
これはcondを使った
(cond ((> na nb) (setq nc na))
(t (setq nc nb)))
と同様であるが、Common Lispでは文ではなく式であるため返却値を利用し、
(setq nc (if (> na nb) na nb))
と書くこともできる。
Pascalでの例[編集]
if na > nb then nc := na else nc := nb
R言語での例[編集]
nc <- ifelse(na > nb, na, nb)
FORTRANの例[編集]
if(a.eq.b) c=5
上記の記述ではa=b
の場合c=5
になる簡単なプログラム例である。
if(a.eq.100) then
b=30
else if(a.eq.80) then
b=25
else
b=20
end if
上記の記述ではa=100
の場合はb=30
となり,a=80
の場合はb=25
,その他の場合はb=20
となるプログラム例である。
論理積・論理和による擬似的なIf文[編集]
仮に &&
を論理積を表す演算子として、
左辺 && 右辺
という論理式で、左辺が真にならなければ右辺を評価しない言語(短絡評価)では、これを
If (左辺) { 右辺 }
と等価とみなすことができる。つまり左辺が条件文で、右辺が真文となるわけである。
同様に ||
を論理和を表す演算子だとすると、
左辺 || 右辺
は
If (Not 左辺) { 右辺 }
と等価となり、左辺が偽のときだけ右辺が実行される。
たとえばMS-DOSやWindowsのバッチファイルでは
CHDIR C:\HOGE || ECHO フォルダがみつかりません
(もしCHDIRコマンドが失敗したら、ECHOコマンドが実行される)
JavaScriptなど言語によっては、このように論理積演算や論理和演算を擬似的なIf文にできることがある。