目次
IF文とは条件を分岐させるための構文で、条件が成り立つときと成り立たないときで異なる処理を実行することができます。
処理が1行の場合(真は必須)はIF文を、2行以上の処理を書くときはIFB文を使います。
マルチステートメント で複数行を1行にして書くのも禁止です。
- 構文
- IF 式 THEN 真 [ELSE 偽]
- 引数
- 戻り値
IF文とは
IF文は条件や値によって処理を分岐させ、一致するときとしないときの処理を分けることができます。条件が一致することを「真(True)」、条件が一致しないことを「偽(False)」といいます。
IF文の条件式は真偽値で判定され、真のときにはTHEN節 、偽のときにはELSE節が実行されます。条件が数値の場合、真偽値は0がFalse、0以外がTrueと判定されます。
数値が真偽値でTrueになるのかFalseになるのかがわからない場合、VARTYPE関数 (スクリプト関数)で型変換を行うことで調べることができます。
PRINT VARTYPE(真偽値を調べる値, VAR_BOOLEAN)
例えば10の真偽値を調べる場合は以下のようになります。
PRINT VARTYPE(10, VAR_BOOLEAN)
- 結果
True
以上の結果から10はTrueを返すことがわかります。
フローチャート
IF文をフローチャートで表すと以下のいずれかになります。
条件式がTrueのときに処理を実行し、Falseのときに何も実行しないときは以下のようになります。
IF 条件式 THEN 処理
条件式がTrueのときに処理1を実行し、Falseのときに処理2を実行するときは以下のようになります。
IF 条件式 THEN 処理1 ELSE 処理2
IF文で使える演算子
比較演算子
比較演算子とは2つの式や値を比較するための演算子で、2つの値が等しい・等しくない、大きい・小さいといった比較ができるようになります。
比較演算子を使うことで、○○と一致したときや○○ではないときといった条件式を書くことができます。
UWSCで使える比較演算子は以下のとおりで、a,bはともに数値が代入されているものとします。
演算子 | 記述例 | 意味 |
---|---|---|
< | a < b | aがbより小さければ真 |
<= | a <= b | aがb以下ならば真 |
> | a > b | aがbより大きければ真 |
>= | a >= b | aがb以上ならば真 |
= | a = b | aとbが等しければ真 |
<> | <> b | aとbが等しくなければ真 |
比較演算子の使い方
比較演算子は2つの式を比較した結果を論理値で返します。式が成り立つ場合はTrue、成り立たない場合はFalseを返します。
以下はaに5、bに10を代入し、その2値を比較演算子で比較した結果を出力します。
a < bは値を代入すると5 < 10となりこの式は成り立つので、Trueを返します。
DIM a = 5
DIM b = 10
PRINT a < b
- 結果
True
次にa・bの値はそのまま、演算子だけ変えたプログラム。a >= bは値を代入すると5 >= 10となりこの式は成り立たないため、Falseを返します。
DIM a = 5
DIM b = 10
PRINT a >= b
- 結果
False
比較演算子はこのように比較した結果によってTrue、Falseを返す演算子です。
論理演算子
論理演算子とは、論理演算をするための演算子のことで、論理演算子を使うことで○○かつ○○、○○または○○といった比較演算子だけではできない複数の条件式を比較するといった書き方ができるようになります。
以下の例ではa,bともに論理値(TrueまたはFalse)が代入されているものとします。数値の場合は論理演算ではなくビット演算になるので注意が必要です。
演算子 | 記述例 | 意味 |
---|---|---|
AND | a AND b | aとbがともに真の場合に真 |
OR | a OR b | aかbの少なくとも1つが真の場合に真 |
XOR | a XOR b | aかbのいずれか一方が真の場合に真 |
! | !x | xが偽の場合に真 |
論理演算子の使い方
比較演算子では○○より大きいいったと式を書くことができましたが、論理演算子を使うと○○より大きい、かつ○○より小さいといった複数の条件を書くことができます。
以下のプログラムはaが10以上かつ20未満が成り立ちTrueを返します。
DIM a = 15
PRINT a >= 10 AND a < 20
- 結果
True
処理の流れとしては、aの値をa >= 10 AND a < 20に代入して15 >= 10 AND 15 < 20、比較演算子を評価してTrue AND True、論理値の比較でTrueとなります。
処理の順番には決まりがあるので、演算子の優先順位を参考にしてください。
次に、以下のプログラムはaが10以上かつ20未満が成り立たないのでFalseを返します。
DIM a = 30
PRINT a >= 10 AND a < 20
- 結果
False
処理の流れとしては、aの値をa >= 10 AND a < 20に代入して30 >= 10 AND 30 < 20、比較演算子を評価してTrue AND False、論理値の比較でFalseとなります。
IF文の書き方
これまでに出てきた比較演算子・論理演算子を使ってIFとTHENの間に条件式、THENの後ろに条件式が成り立ったときの処理を書きます。THENより後ろの真の部分をTHEN節といいIF文で書ける処理は1行だけです。2行以上記述する場合は、IFB文を使います。
以下のプログラムは、条件式が成り立ちTrueを返すのでTHEN節が実行されます。
DIM a = 5
DIM b = 10
IF a < b THEN PRINT "aはbより小さいです。"
- 結果
aはbより小さいです。
条件式が成り立たなかったときは何も出力されません。
DIM a = 10
DIM b = 5
IF a < b THEN PRINT "aはbより小さいです。"
条件式が成り立たなかったときはTHEN節の後ろにELSEを書き、続いて処理を記述します。THEN節と同様にELSEより後ろの偽の部分をELSE節といいます。
DIM a = 10
DIM b = 5
IF a < b THEN PRINT "aはbより小さいです。" ELSE PRINT "aはbより小さくありません。"
- 結果
aはbより小さくありません。
ELSE節を記述すると1行でもIF文だとかなり見づらくなるので、IFB文を使って書くことをおすすめします。
DIM a = 10
DIM b = 5
IFB a < b THEN
PRINT "aはbより小さいです。"
ELSE
PRINT "aはbより小さくありません。"
ENDIF
- 結果
aはbより小さくありません。
記述例
変数は左辺に書く
数値と変数を比較するときは、変数を左辺に持ってくる。
以下の例だと上はnが10以上ならばだが、下は10がn以下ならばというニュアンスになり読みづらいしわかりにくい。
IF n >= 10 THEN
IF 10 <= n THEN
ちなみに、条件式の左辺に数値を持ってくる書き方をヨーダ記法というそうです。
条件が複数あるときは入れ子にし過ぎない
条件が複数あるときはIF文を入れ子にせず、論理演算子(ANDやOR)を使い条件を横並びに書く。
IF score >= 50 AND score < 60 THEN
PRINT "50以上60未満です。"
ENDIF
IFB score >= 50 THEN
IFB score < 60 THEN
PRINT "50以上60未満です。"
ENDIF
ENDIF
数値が範囲内にあるか
数値が指定した範囲内にあるかどうか調べるには、ANDで条件式を並べます。
IFB n >= 10 AND n < 20 THEN
PRINT "10以上20未満です。"
ENDIF
以下のように関係演算子を複数並べた書き方はできません。
IFB 10 <= n < 20 THEN
PRINT "10以上20未満です。"
ENDIF
演算子を使わない書き方
数値を返す関数の場合、演算子を省略することもできます。
以下の例だとstrにabcが含まれていなければ0、含まれていればその位置を(1以上の)数値で返すのでその結果で条件分岐ができます。
IF POS("abc", str) THEN
以下はabcがないとき真。
IFB POS("abc", str) = 0 THEN
PRINT "見つかりませんでした。"
ENDIF
以下はabcがあるとき真。
IFB POS("abc", str) <> 0 THEN
PRINT "見つかりました。"
ENDIF
真偽値を返す場合、TRUE・FALSEを省略可能
ブール型を返す関数の場合、わざわざTRUE・FALSEと比較する必要はないです。
以下は画像が見つかったとき真。
IFB CHKIMG("image.bmp") THEN
PRINT "画像が見つかりました。"
ENDIF
真偽値を省略しない場合。
IFB CHKIMG("image.bmp") = TRUE THEN
PRINT "画像が見つかりました。"
ENDIF
否定のときは!(エクスクラメーションマーク)をつけます。
以下は画像が見つからなかったとき真。
IFB !CHKIMG("image.bmg") THEN
PRINT "画像が見つかりません。"
ENDIF
真偽値を省略しない場合。
IFB CHKIMG("image.bmp") = FALSE THEN
PRINT "画像が見つかりませんでした。"
ENDIF