if 文を使ってみよう

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 文について、より汎用的に書きますと、以下のようになります。

ifthen

つまり、「式」が True (真)のとき「文」が実行される事になります。

if ... then ... else ...

これまでの 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 ...

「…の場合には、○○を実行、そうでなければ××を実行」という形式があるなら、 「…の場合には、○○を実行、△△の場合には、□□を実行、そうでなければ××を実行する」 という形式があってもおかしくありませんね。これに当てはまるのが、

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 文の使い方の解説となっています。

複数の条件が True の場合に、特定の文を実行したい時は?

例えば、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 に設定すると、ちゃんとフォームの色が青に変更されるかどうか等)。

複数の条件があり、そのどれか一つでも条件が True の場合に特定の文を実行させたい

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 文に注意!

ネストした 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 文が入れ子の場合には、注意しなければならない点です。


up next
Last Update 2002/11/14 by N.Kobayashi