C初級:if文による条件判定について

C言語初級カテゴリのロゴ画像C言語初級
スポンサーリンク

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文の基本的な使い方でした。

コメント

  1. […] if文で数値の比較を行う方法は、10.if文による条件判定についてで述べました。 […]