C言語には条件による処理判定として3つの記述が用意されています。
1.if文(もっとも使用頻度が高い)
2.switch文(あまり使うことはない。というか無くてもよい機能)
3.三項演算子(場合によっては使うが、プログラムが読みにくくなる時がある)
ここでは最も使用頻度が高いif文を使った条件判定についてみていきます。
正直なところswitch文や三項演算子はなくてもif文さえあれば事足ります。
サンプルプログラム if.c
/* if文による条件判定 */ #include <stdio.h> int main(void) { int x; printf("数値を入力してください: "); scanf("%d", &x); if(x >= 50){ printf("OK\n"); } else{ printf("NG\n"); } return 0; }
解説
実行するとキーボードから数値を入力待ちになります。
適当な数値を入力すると画面に「OK]または「NG]が表示されます。
OKとNGが同時に表示されることはありません。
必ずどちらか一方という流れになります。
これを言葉にすると「条件が成り立つ」「条件が成り立たない」で説明できます。
条件が成り立つことを「真」(しん)といい、条件が成り立たないことを「偽」(ぎ)といいます。
コンピュータは何でも数値化して記憶するので、この条件が成り立つ、成り立たないも同様です。
C言語では真の状態を0以外の値で表し、偽の状態を0で表すことにしています。
成り立つ | 真 | 0以外(1になることが多い) |
成り立たない | 偽 | 0 |
ところで成り立つときの0以外の値(基本的には1と考えて差し支えないです)とは何でしょうか?
ここで確認をしてみます。
サンプルプログラム: hikaku1.c
#include <stdio.h> int main(void) { int a = 10; printf("比較の値: %d\n", a == 10); return 0; }
printf関数で a == 10 の比較式を結果を表示しています。
初期状態として変数aには10が代入されているので、この場合 a == 10 は成り立ちます。
すなわち0以外の値になるということです。
実行結果
比較の値: 1
次にプログラムを修正して変数aの初期値を100 に変更してみます。
サンプルプログラム: hikaku2.c
#include <stdio.h> int main(void) { int a = 100; printf("比較の値: %d\n", a == 10); return 0; }
実行結果
比較の値: 0
この場合、a == 10 は成り立ちませんので、0が表示されたわけです。
このようにC言語では、if文の条件式も数値で扱われています。
極端に考えるとこんなif文も間違いではありません。
#include <stdio.h> int main(void) { if(1){ printf("OK\n"); } else{ printf("NG\n"); } return 0; }
わたしの環境ではコンパイルすると以下の警告が表示されました。
警告 W8008 test.c 4: 条件が常に真(関数 main )
警告 W8066 test.c 8: 実行されないコード(関数 main )
else側のprintf関数は決して実行されないため、当然の警告だと思います。
一応実行するとOKと表示されます。
考え方としては、比較式a == 10などの部分は実行したときに数値化されて0以外の数値か0に置き換わると考えてください。
さらにif文について見ていきます。
次のプログラムを実行してみてください。
サンプルプログラム: 09if.c
/* 09if.c 判定をする */ #include <stdio.h> int main(void) { int time; printf("一日何回食事をしますか? "); scanf("%d", &time); if(time == 1){ printf("食が細いんですか?それとも貧乏なんですか?\n"); } if(time >= 4){ printf("食べすぎじゃないですか?\n"); } return 0; }
実行イメージ
一日何回食事をしますか? 4 [Enter]
食べすぎじゃないですか?
解説
実行すると食事回数を聞いてくるので、キーボードから適当な数値を入力します。
プログラムでは、入力した数値が1のときと4以上のときでメッセージを変えています。
このプログラムにはif文が2つあります。
if文の条件によっては、メッセージが2つとも表示される場合もあることに注意してください。
条件が成り立つときと成り立たないときの2手に分かれる処理を記述したいときはif~else文を使います。
次のプログラムを見て下さい。
サンプルプログラム: 10if.c
/*10if.c 判定をする(成り立つとき、成り立たないとき) */ #include <stdio.h> int main(void) { int points; printf("教習所の本検何点だった? "); scanf("%d", &points); if(points >= 90){ printf("\n免許取得!\n"); } else{ printf("\nまたお金かかるねぇ\n"); } return 0; }
実行イメージ
成り立つ場合
教習所の本検何点だった? 99 [Enter]
免許取得!
成り立たない場合
教習所の本検何点だった? 80 [Enter]
またお金かかるねぇ
解説
キーボードから入力された変数pointsの値が90以上だったら「免許取得!」のメッセージ。
それ以外(89以下の数値の場合)だったら「またお金かかるねぇ」のメッセージを表示します。
elseを使うと89以下の場合などという書き方を省略できます。
次のパターンはどうでしょうか?
/*11if.c 判定をする(Aが成り立つ、AでなくてBが成り立つ、AB以外のとき) */ #include <stdio.h> int main(void) { int n; printf("趣味はいくつある? "); scanf("%d", &n); if(n >= 3){ printf("多趣味だね~\n"); } else if(n == 2){ printf("%dつ?\nひとつはアニメでしょ。\n", n); } else if(n == 1){ printf("あっ。\nわたしも一つ!\n"); } else{ printf("無趣味っていうのの悪くはないねぇ\n"); } return 0; }
実行イメージ
趣味はいくつある? 4 [Enter]
多趣味だね~
解説
ifの後、else ifと続いています。
これは最初の条件が成り立たない場合次の条件を判定する、という場合に使えます。
上記のプログラムには、nが3以上の場合、nが2の場合、nが1の場合、それ以外の場合と4つの条件があることになります。
if文を4つ繋げてもできそうですが、この場合は条件の書き方によってはメッセージが複数表示される可能性があります。
1つの大きなまとまりとして考えた場合、if~else ifで繋げると後で見た時も分かりやすくなります。
以上、if文の基本的な使い方でした。
コメント
[…] if文で数値の比較を行う方法は、10.if文による条件判定についてで述べました。 […]