if 文は、ある条件に一致した場合に、特定の処理を行いたいときに使用します。例えば、 Integer 型の変数 value に 10 という整数値が代入されていたら「Hello」とメッセージを表示したい場合には、以下のようなコードになります。
procedure TForm1.Button1Click(Sender: TObject); var value: Integer; begin value := 10; if value = 10 then // 値 value が 10 であるなら ShowMessage('Hello'); // 「Hello」とメッセージボックスを表示 end;
このコードでは、実行される文が 1 つだけですが、実行文が複数ある場合には、その文を begin と end で実行したい文を囲む必要があります。
procedure TForm1.Button1Click(Sender: TObject); var value: Integer; begin value := 10; if value = 10 then // 値 value が 10 であるなら begin ShowMessage('Hello'); // 実行される文が複数ある場合には、必ず begin と end で囲む ShowMessage('World'); end; end;
もちろん、実行文が 1 つだけの場合でも begin と end を使用しても構いません。これは、単に実行文が 1 つだけである場合に限って、begin と end を省略できるというだけの決まりごとです。
if 文について、より汎用的に書きますと、以下のようになります。
if 式 then 文
つまり、「式」が True (真)のとき「文」が実行される事になります。
これまでの if 文のサンプルでは「…であるなら、○○を実行する」という形式となっていました。if ... then ... else ... という形式では「…であるなら、○○を実行し、そうでなければ、×× を実行する」という様になります。サンプルコードを見てみましょう。
procedure TForm1.Button1Click(Sender: TObject); var value: Integer; begin value := 10; if value = 2 then ShowMessage('Value is 2') // セミコロンがありません! else // value が 2 ではない場合 ShowMessage('Value is not 2'); end;
上記のコードを言葉として解説しますと、「value が 2 であれば ShowMessage('Value is 2') を実行し、そうでなければ ShowMessage('Value is not 2') を実行する」となります。このサンプルでは、value には 10 が代入されていますね。ですから結果的に ShowMessage('Value is not 2') が実行されることになります。
また、コメントにもありますように、セミコロンの使い方に注意してください。if 文に else 節がある場合には、「 else 節の直前にはセミコロンは置かない」と覚えておいて下さい。
「…の場合には、○○を実行、そうでなければ××を実行」という形式があるなら、 「…の場合には、○○を実行、△△の場合には、□□を実行、そうでなければ××を実行する」 という形式があってもおかしくありませんね。これに当てはまるのが、
if ... then ... else if ... then ... else ...
という形式です。早速サンプルを見てみましょう。
procedure TForm1.Button1Click(Sender: TObject); var value: Integer; begin value := 5; if value = 2 then ShowMessage('value is 2') else if value = 5 then ShowMessage('value is 5') else ShowMessage('else'); end;
このコードにおける if 文を文章で表現しますと、次のようになります「value が 2 であるなら ShowMessage('value is 2') を実行し、value が 5 であるなら ShowMessage('value is 5') を 実行し、それ以外であるなら(つまり、value が 2 でもなく 5 でもないなら) ShowMessage('else') を 実行せよ」となります。
if 文において else 節は、必ずしも必要ではありません。つまり、else 節はあってもいいし、 なくてもいいです。
procedure TForm1.Button1Click(Sender: TObject); var value: Integer; begin value := 20; if value = 2 then ShowMessage('value is 2') else if value = 5 then ShowMessage('value is 5'); end;
このコードですと、if 文での評価が true になることはありませんので、 メッセージボックスは表示されません。
if 文での処理の流れを図にした場合、次のようになります。
これまでに紹介しましたサンプルが理解できているのでしたら、if 文について、これ以上学ぶことは 殆どありません。あとは実際に沢山コードを書いていくことだけが今後の目標です。以降に続く解説では、これまでの説明を踏まえて、一歩進んだ if 文の使い方の解説となっています。
例えば、Integer 型の変数 Value と Number の値が共に 5 であるときに、特定の文を 実行したい場合には、以下のようにコードを書くと思います。
procedure TForm1.Button1Click(Sender: TObject); var Value, Number: Integer; begin Value := 5; Number := 5; if Value = 5 then if Number = 5 then ShowMessage('Value と Number は 5 です'); end;
このコードは正しいコードですが、if 文がネストしています。 ネストしていることが悪いことではありませんが、 このような場合、つまり複数の条件が true である時に、特定の文を実行したい場合には、and 演算子が利用できます。
procedure TForm1.Button1Click(Sender: TObject); var Value, Number: Integer; begin Value := 5; Number := 5; if (Value = 5) and (Number = 5) then ShowMessage('Value と Number は 5 です'); end;
and 演算子を使用した場合には、全ての評価が true である場合にだけ、その if 文での 評価が true となります。つまり、このサンプルプログラムでは、Value が 5 であり、且つ、 Number が 5 である時に初めて true と評価され、ShowMessage('Value と Number は 5 です');が実行されることになります。
次のサンプルでは、Value が 10 であり、且つ Number が 20 の時には, フォームの色を青を変更する ようにし、Value が 20 であり、且つ Number が 10 であるなら, フォームの色を緑に変更する プログラムです。
procedure TForm1.Button1Click(Sender: TObject); var Value, Number: Integer; begin Value := 10; Number := 20; if (Value = 20) and (Number = 10) then Color := clBlue else if (Value = 10) and (Number = 20) then Color := clGreen; end;
Value, Number の値を、いろいろ変更してみてください(例えば、Value を 20 に設定し、 Number を 10 に設定すると、ちゃんとフォームの色が青に変更されるかどうか等)。
and 演算子の場合は、複数の条件が全て true の場合に、特定の文を実行させる事が出来ます。これとは別に、or 演算子という演算子もあり、この or 演算子では、複数の条件のどれか一つでも true と評価されれば、その if 文での評価が true となります。
procedure TForm1.Button1Click(Sender: TObject); var Value, Number: Integer; begin Value := 5; Number := 10; if (Value = 3) or (Number = 4) then // Value が 3 又は Number が 4 であれば true ShowMessage('Value が 3 であるか、又は Number が 4 です') else if (Value = 6) or (Number = 10) then // Value が 6 又は Number が 10 であれば、true ShowMessage('Value が 6 であるか、又は Number が 10 です'); end;
例えば、変数 Number の値が 20 ではない時にだけ、ある文を実行したい場合、not 演算子を使用出来ます。
procedure TForm1.Button1Click(Sender: TObject); var Number: Integer; begin Number := 100; if not (Number = 20) then // 括弧は必須です ShowMessage('Number は 20 ではありません'); end;
このサンプルで重要な点は、if 文での評価です。
if not (Number = 20) then
この場合、Number には 100 が代入されていますので、(Number = 20) の評価は false が 返ります。そして not 演算子により、その評価の逆(つまり true)が返される事になります。
not 演算子は、いろいろな用途で利用でき大変便利ですが、このサンプルに限っては、not 演算子は使うべきではありません。なぜなら、次のように記述する 事で、コードをよりストレートに表現できるからです。
procedure TForm1.Button1Click(Sender: TObject); var Number: Integer; begin Number := 100; if Number <> 20 then ShowMessage('Number は 20 ではありません'); end;
not が行う演算は論理否定です。つまり、評価された式の逆を返しますので、「Number が 20 である場合の逆」と表現するよりは、「Number が 20 ではない場合」と表現する方が、直感的にコードを 理解できます。それでは not 演算子のふさわしい出番は、どのようなときでしょうか。
一例としては、Boolean 型の変数使用時で、且つ、その変数の値が false の場合に、 特定の文を実行したい場合などには、not 演算子を使用すると便利です。
procedure TForm1.Button1Click(Sender: TObject); var IsEven: Boolean; begin IsEven := false; if not IsEven then ShowMessage('IsEven は false です') end;
ネストした if 文には、少し注意しなければならない点があります。以下のサンプルは、引っ掛け問題です。インデントに注意して見て下さい。
procedure TForm1.Button2Click(Sender: TObject); var value: Integer; begin value := 12; // インデントに注意! if value > 50 then if value < 100 then ShowMessage('aaa') else ShowMessage('bbb'); end;
実行してみると分かりますが、ボタンを押してもメッセージボックスは表示されません。else 節は、もっとも近い if 文と結びついています。ですから上記のコードは、次のコードと等価です。
procedure TForm1.Button2Click(Sender: TObject); var value: Integer; begin value := 12; if value > 50 then begin if value < 100 then ShowMessage('aaa') else // else は、最も近い if 文と結合 ShowMessage('bbb'); end; end;
if 文が入れ子の場合には、注意しなければならない点です。