If 命令文ブロックは、True か False の答えを必要とする質問として、考えることができます。
質問の答えは、プログラムが、どのセクションのコードを実行するかを、決定します。
コンピュータは、数だけで動作するので、False のための 0 か、True のための非ゼロの、どちらかの結果になる条件付きの方程式として、質問をまとめます。
If 命令文は、下の形式です。
If <式> Then Do something
[:Do something]
<式> は、True か False 答えを必要とする問題です。
答えが True、すなわち、False でなければ、Then に続くコードが、実行されます。
答えが False であれば、コードの次の行が、実行されます。
コロンで命令文を切り離すと、Then の後に、複数の命令文を作成できます。
同じ行の上に、全ての命令文を書く必要があります。
下のように、IF コード・ブロックを使うと、より分かりやすくなります。
If <式> Then
Do something 1
Do something 2
...
End If
上の形式では、答えが True であれば、Then に続くコードブロック、命令文1から始まって、End Ifに達するまでの、すべての命令文、が、実行されます。
そして、プログラムは、End If の後のコードを、実行し始めるでしょう。
答えが False であれば、コード・ブロックのコードはスキップされます。そして、End If に続くコードが、実行されます。
If <式> Then
Do something
...
Else
Do something Else
...
End If
上の形式では、<式>が True であれば、Then に続くコードが、実行されます。
答えが False であれば、Else に続くコードが、実行されます。
この形式では、<式>の、True と False 両方の答えを、記述できます。
If <式> Then
Do something
ElseIf <式> Then
Do something
End If
上の形式では、<式>が True であれば Then に続くコードが、実行されます。
答えが False であれば、
ElseIf が、実行されます。
ElseIf が True であれば、Then (ElseIf の) に続くコードが、実行されます。さもなければ、End If に続くコードが、実行されます。
あなたが、尋ねる必要がある多くの質問の範囲を全てカバーしたいとき、これらに該当するだけの、ElseIf 命令文を持つことができます。
If <式> Then
Do something
ElseIf <式> Then
Do something
Else
Do something Else
End If
上の形式は、他のすべての形式の組み合わせです。
<式>が True であれば、Then に続くコードが、実行されます。
答えが False であれば、ElseIf は実行されます。
ElseIf が True であれば、Then (ElseIfの) に続くコードが、実行されます。さもなければ、Else に続くコードが、実行されます。
この形式は、あなたが、一連の質問をすることを可能にします。そして、答えがすべての質問に対して False であれば、Else ブロックに基づく動作のデフォルト方針を取ることができます。
お分かりのように、あなたは、多くの方法で質問をまとめて、次に、多くの答えの組み合わせに基づくコードを実行できます。
これは、どのように質問をまとめるか、そして、答えに基づき何をさせるかについて、多くの柔軟性をあなたに与えます。
<式>は答えを必要とする質問です。そして、あなたは
論理演算子を使って、質問をまとめます。
If 命令文の中で、算術演算、論理演算子を、丸括弧も使って、混ぜることができます。
コンパイラは、演算子の優先順位を考慮に入れて、左から右に、条件文を評価します。
例えば、下のコード切れ端のすべてが、文法的な If 命令文構造です。
If var1 = 5 Then
If (var1 = 5) And (var2 < 3) Then
If (var1 + 6) > 10 Then
丸括弧は、式の異なる部分を集めるのに用いられます。
丸括弧を、式の論理的な部分を、確実に実行するために、使って下さい。
式の中で算術演算子を使っていても、式は、結局、True か False のどちらか決まるものでなければなりません。
IF 命令文で、ビット単位の演算子を使う
演算子 And、Or、および、Not が、ビット単位の演算子であることを、覚えておいてください。
ビット演算子は、ビット演算子が行う、ビットごとの操作に基づく値を、返します。
If 命令文の中でビット単位の演算子を使用するとき、結果が正しく評価されていることを確認するように、注意すべきです。
上に記載された、2番目のコードの部分を見てみましょう。
If (var1 = 5) And (var2 < 3) Then
var1 が 5 と等しいなら、コンパイラは、式のために True、または -1 を返します。
var2 が 3 未満であれば、コンパイラは、この式のために True か -1 を返します。
そして、コンパイラは、-1 と -1 の And 演算子を評価して、-1 を返します。
-1 は、非ゼロ、または True なので、Then に続くコードは、実行されます。
丸括弧の中の命令文のどちらかが 0 に評価されると、And は 0 (これは False です) を返します。そして、Then 節に従うコードは、スキップされます。
ビットごとの演算子を用いるとき、演算子が True か False かのどちらかを返すように、ビット演算子のどちらかに条件式を構成しなければなりません。
こうすると、評価における一貫した結果が、与えられます。
Not 問題
ビット単位の演算子 Not は、If 命令文では問題になる可能性があります。
あなたが
If Not var Then と書くとき、Not はビット演算ではなく、論理演算として機能することを期待して使うかもしれません。
FreeBASIC では、Not は論理演算ではなく、ビット演算を実行します。
var が 3 (11)の値を含むつもりなら、Not 3 は、-4 (11111100)で、True 結果と見なされます。そして、Then に続くコードは実行されます。これは、たぶんあなたが欲しかったものでないでしょう。
あなたは、
If Not var Then と書く代わりに、
If var <> 0 Then と書くべきです。
条件を重ね合わせる
複合条件を使用するとき、条件が重ならないように注意しなければなりません。
条件を重ね合わせると、予測できない結果になることが、よくあります。
各条件はユニークな結果を生まなければなりません。そして、個々の結果の組み合わせも、ユニークな結果を表現しなければなりません。
これは、If-ElseIf 構造で、とても重要です。
If-ElseIf ブロックの中の重ね合わせ条件は、間違った時に、間違ったコードを実行するかもしれません。
If 命令文の入れ子
時々、評価の意思決定プロセスをよりよく記述するために、If 命令文の入れ子が必要になるかもしれません。
If 命令文は、式の中で複数の引数を扱うことができます。しかし、ある範囲の値に対して、入れ子にされた If ブロックを使って、追加的にチェックしたい場合があります。
If <式> Then
<statement>
...
If <式> Then
<statement>
<statement>
...
End If
End If
各ブロックが、If で開かれるとき、End If を使って適切に閉じることは、コンパイラのエラーや、論理的な誤りを避けるために、重要です。
コンパイラのエラーは、比較的、修正しやすいですが、論理的な誤りは、捜し出して、修正することは、大変です。
適切にブロックを閉じる最も良い方法は、入れ子にされた If 命令文を字下がりにすることです。そして、対応する End If 命令文を、If と同じレベルに、字下がりにすることです。
上の例では、字下がりで、どの If が、どの End If と対応するか、一目で分かるでしょう。
IIF 関数
Iif ("immediate If") 関数は、式にもとづき、2 つの数値のうちの 1 つを返します。
Iif 関数は、関数呼び出しとして振舞う、インライン If 命令文と考えることができます。
Value = IIf
(<式>, numeric_value_if_true, numeric_value_if_false)
Iif は、独立した関数として、使用できます。また、If 命令文を挿入することで、式を分離したくないところで、他の式の中に埋め込んで、使用できます。
数の値には、直定数の値や、変数や、数値関数呼び出しを、使えます。
この関数の制限は、戻り値が、文字列の値ではなく、数の値を返すことだけです。しかし、ポインタを使うことで、この制限の周りで働くことができます。
Iif 命令文は、True と False 条件の両方を評価します。したがって、あなたは、違法操作、例えば、条件の中で ゼロで割るようなこと、を実行しないように注意する必要があります。たとえ、関数から、この条件が返ることがないとしても、です。 |
質問を構成する
If 命令文は強力な道具ですが、質問、すなわち、式を、正しく構成することを確実にしなければなりません。
各、式は、True か False に、解決しなければなりません。そして、True の場合に、いつも、Then に続くコードが実行されるようにしなければなりません。
If 命令文を書くとき、あなた自身に問いかけるとよいでしょう。この式は、True か False に決まりますか?
これは、特に、式の中で、いくつかの条件がある複合式にとって真実です。
それぞれの条件は、True か False に決まらなければなりません。そして、条件の合計も、True か False に決まらなければなりません。
もし、複合式が正しく評価できるか疑わしければ、細かく分けて、入れ子にした If 命令文にしてください。
値の範囲をチェック
しばしば、If 命令文の中で、値の範囲をチェックすることがあります。コンパイラが正しく範囲の条件を評価するように、正しく式を構成する必要があります。
基本的に、二つの範囲表現があります:
排他的と、両立的の、二つの範囲です。
排他的な範囲式は、値の範囲を除きます。
両立的な範囲式は、値の範囲を含んでいます。
それぞれ、適切な評価のために、従わなければならない特定の形式があります。
値の範囲を除外
値の範囲があって、値が 1 以下か、値が 10 以上の場合にだけ、何か特別なことをしたい、と仮定してください。
これを、別の言い方にすると、あなたは、2〜9 の場合に、特別な動きをから、除外したいと思っていることになります。
あなたは、コードに翻訳できる質問として、下のように構成することができます。
Is the value a number less than Or equal To 1 Or a number greater than Or equal To 10?
If Yes, Then Do special action.
If No, Then Do standard action.
ここのキーは、OR です。
価値の下(上)限が1以下 OR 価値の上(下)限が10以上 、ならば、特別な動きをするということです。
If (value <= 1) Or (value >= 10) Then
do_special
Else
do_standard
End If
OR は、どちらかの状態が True であれば、True を返すことを覚えてください。
値が 1 以下であるか、値が 10 以上であれば、式は True を返します。そして、特別な動きは実行されます。
値の範囲を包含
包含は、除外の正反対です。
ご推察のように、形式は同様ですが、OR 演算子の正反対の、And 演算子を使用します。
値が 5、6、7 であれば、何か特別なことをしたい、と仮定してください。
これは、あなたの範囲の式の中に、これらの数を含めることを意味します。
あなたは、質問することによって、始めることができます。
Is the value a number between 5 And 7 (inclusive)?
If Yes, Then Do special action
If No, Then Do standard action
ここで、あなたは、条件として、数、5、6、7 を含めたいと思っています。
これは、値が 5 以上 AND 値が 7 以下の場合に、何か特別なことをします。
これは、下のコードの小片に、翻訳されます。
If (value >= 5) And (value <= 7) Then
do_special
Else
do_standard
End If
And 演算子は、両方の演算対象が True を返す場合にだけ、True を返すことを覚えてください。
値が 6 であれば、6 は 5 以上です。そして、また、6 は 7 以下です。したがって、両方の命令文は True です。そして、式は、True に評価されます。