KID's World
 

おしながき
トップページ
プログラミング
研究
いんすぴ
色日記
ソフトウェア
KID's Worldの歴史
リンク
小出俊夫について


制御文その3−if else文

if文は条件によって実行する文を変えることを知る

 

if else文 〜条件分岐〜

 if文がプログラムの全てといってもいいでしょう。今までの制御文はくり返すだけでしたが、この制御文は場合によって実行する文を変えるという機能を持っています。この制御文を使うことで、プログラミングの世界は広がります。

 
if (式)
  文1
else
  文2

 英語のつづりからも分かるように、もし「式」が真なら「文1」を、偽なら「文2」を実行します。また「else」以下は省略することができます。

 
#include <stdio.h>

main()
{
  int i = 0;

  while(1){
    i++;
    if (i == 10)
      break;
  }
}

 この例は何をやっているか分かりますか? while文によって無限ループを作っています。ループの中ではiをひとつずつ増やしていって、もしiが10になったらbreak文を実行して無限ループから脱出しています。つまり、while文とif文でfor文のまねをしています

 if else文も所詮は文ですから、「if文の文を書くところ」にifを書くことによって複雑な処理をすることができます。

 
#include <stdio.h>

main()
{
  int a = 100, b = 200, c = 300;

  if (a < b){
    printf("aはbより小さく、");
    if (b < c) printf("bはcより小さいので、aはcより小さい。\n");
    else       printf("bはcより大きい。\n");
  }
  else{
    printf("aはbより大きく、");
    if (b < c) printf("bはcより小さい。\n");
    else       printf("bはcより大きいので、aはcより大きい。\n");
  }
}

 ちょっと普通の書き方から外れていますが、C言語はフリーフォーマットで記述できるので、書く位置はどこでもかまいません。逆にこの例を普通に書いてしまうと見にくくなります。いつでも見易いプログラムを心掛けてください。そうするとバグも見つけやすくなります。

 ところで、この例はa,b,c三つの変数の大小関係を調べて画面に文章を表示するプログラムです。このままコンパイルすると、「aはbより小さく、bはcより小さいので、aはcより小さい。」と表示されます。変数の値を変えたり、いろいろ試してif文の動作を理解してみてください。

 さて、次の例はちゃんとコンパイルができますが、プログラマの意図に反した動作をします。どこに誤りがあるのでしょうか。

 
#include <stdio.h>

main()
{
  int a = 101, b = 200;

  if (a == 100)
    if (b == 200)
      printf("aは100で、bは200です。\n");
  else
    printf("aは100ではありません。\n");

}

 プログラマは「aには101が入っているから、100ではないとの旨のメッセージが表示される」ことを期待してこのプログラムを作りました。しかし画面には何も表示されません。いったいどうしたことでしょうか。aに100、bに201を入れると、画面にはどんな文字が表示されましたか? どうしてそんな文字が表示されたのでしょうか。「コンパイルができるのに、しかもちゃんと実行されるのに、なぜかうまく動いてくれない」これは初心者がC言語でつまずきやすいパターンです。よく考えてから次を読んでください。

 

 さて、例の謎は解けましたか?

 
#include <stdio.h>

main()
{
  int a = 100, b = 201;

  if (a == 100){
    if (b == 200)
      printf("aは100で、bは200です。\n");
    else
      printf("aは100ではありません。\n");
  }
}

 前の例をちょっと書き換えてみました。これを見ればどうしてそうなったのか一目瞭然ですね。では、プログラマが意図した通りにこのプログラムが動くように前の例を書き換えておきます。

 
#include <stdio.h>

main()
{
  int a = 101, b = 200;

  if (a == 100){
    if (b == 200)
      printf("aは100で、bは200です。\n");
  }
  else
    printf("aは100ではありません。\n");

}

 前回の間違った例は、確かに人の目から見ればちゃんと動くように見えるのですが、コンパイラの目から見ればそうは行きません。なぜなら空白や改行を無視するからです。

 「コンパイルできるのに…」という状態に陥ったときは、先入観を捨ててコンパイラの目になってソースを吟味してみる必要があります。それでもだめなら、外に行ってランニングでもして頭をリフレッシュしてからもう一度見てみてください。「あっ、そーいうことだったのか〜、ばっかだなー俺っ」と、大きな声をあげてみんなをびっくりさせていることでしょう。

 たくさん失敗を重ねていけば、その分だけこのような失敗は少なくなっていきます。そしてどんどんソースを組む時間が短縮されていきます。そしてそのころには、あなたはもう誰からも尊敬される、上級のプログラマになっていることでしょう。

 

まとめ。

  1. if else文を使えば、条件によって実行する文を変える事ができる。
  2. else以降は省略可能。
  3. if文の中にif文を書く事もできるけど、落とし穴がある。

(1997/01/30公開 1999/03/13 改)

[目次へ] [次へ]

 

ちょっと休憩のコーナー

ここをクリックしてください。  突然ですが、日経BPってご存知でしょうか。少なくともコンピュータ関係に深く関わっている方ならよく知っていると思います。いわゆる専門誌(雑誌)なのですが、年間購読のみで、毎月送られてきます。発売されている雑誌の数は数十にのぼり、本当に詳しく、しかもかなりためになる内容が満載です。私は大学院で読んでいるのですが、今ではなくてはならない情報源の一つになっています。大学院を卒業してから、もし会社もでこれが読めないのであれば、ぜひ購読したいと思っています。右上の広告をクリックして現れるページにある、「日経BP社の雑誌」をクリックしてどんな雑誌があるか調べてみてください。きっとためになる一冊があるはずですよ。

 著作権は全て小出 俊夫にあります。KID's World © 1996-2003 Toshio Koide.

 対応ブラウザについて