FreeBASIC マニュアルのトップに戻る

FreeBASIC IF 命令文

目次→教本→いっしょに学ぼうThe IF Statement←オリジナル・サイト

IF 命令文 左にメニュー・フレームが表示されていない場合は、ここをクリックして下さい

←リンク元に戻る プログラム開発関連に戻る


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 に評価されます。

いっしょに学ぼう に戻る

編集者注:AndAlsoOrElse も参照ください。

最終 Sancho3によるレビュー(2018年2月6日)

←リンク元に戻る プログラム開発関連に戻る

ページ歴史:2018-02-11 11:45:06
日本語翻訳:WATANABE Makoto、原文著作者:WikiRick(Rick Clark aka rdc)

ホームページのトップに戻る

表示-非営利-継承