4-1 if文

この記事は約6分で読めます。

if文

我々は普段の生活においていつも全く同じ行動をしているわけではありません。その時の状況によって何をすべきか常に判断して行動していることだと思います。C言語でも同じです。状況や状態によってプログラムの動作を変えることができます。if文を使うと、条件が満たされた時だけある動作を実行することができます。

//パターン1
if (条件式) 文;
//パターン2
if (条件式){
	文1;
	文2;
	...
}

if文の書き方には上の2つのパターンがあります。条件式を評価して、その値が真(=0でない整数値)ならば文が実行されます。偽(=0)の場合はこの文は実行されず、if文の次の文が実行されます。条件式が真の時に実行する文が一行の時はパターン1の書き方をし、複数行にわたるときはパターン2の書き方をするのが一般的です。一行の時でもパターン2の書き方をしても構いません。

サンプルコード

#include <stdio.h>
int main(void){
	int a;
	puts("a=?");
	scanf("%d",&a);
	if (a) puts("aは真です。");
	puts("ifの次の文です。");
	return 0;
}

実行結果1

a=?
3
aは真です。
ifの次の文です。

実行結果2

a=?
0
ifの次の文です。

aの値が0以外のときはif文のputs(“aは真です。”);が実行されます。aが0の時は実行されず、7行目に制御が移ります。7行目のputs(“ifの次の文です。”);はif文とは関係ないので条件に関係なく実行されます。

条件式が偽の時の処理

さきほどのif文と使ったプログラムでは条件式が真の時にのみ特定の処理を実行するものでした。しかし、実用的には条件式が偽の時も別の処理をしたいという時が多いです。そんな時のためにelse文が用意されています。

//パターン1
if (条件式) 文1;//条件式が真の時のみ
else 文2;//条件式が偽の時のみ
//パターン2
if (条件式){
	文1;//条件式が真の時のみ
	...
} else {
	文2;//条件式が偽の時のみ
	...
}

if文の直後にelseをつけることができ、elseの後の文は条件式が偽の時にのみ実行されます。if文のあと以外の場所でelseを使うことはできません(コンパイルエラーとなります)。else文も2パターンの書き方がありますが、パターン1の書き方だと偽の時に実行する文が一つしか指定できないのでパターン2のほうが一般的です。

#include <stdio.h>
int main(void){
	int a;
	puts("a=?");
	scanf("%d",&a);
	if (a){
		puts("aは真です。");
	} else {
		puts("aは偽です。");
		puts("条件式が偽の時の文 2つ目");
	}
	puts("この文は条件式に関わらず実行されます。")
	return 0;
}

実行結果1

a=?
2
aは真です。
この文は条件式に関わらず実行されます。

実行結果2

a=?
0
aは偽です。
条件式が偽の時の文 2つ目
この文は条件式に関わらず実行されます。

> < 演算子

数学の不等号は右と左どちらの数が大きいか小さいかを表す記号でした。C言語の不等号は左右のオペランドどちらが大きいかまたは小さいかを判断する演算子です。例えば、a>bという式はaがbより大きいとき真となり、そうでない場合は偽となります。つまり、aがbより大きいときa>b=1、aがb以下の時a>b=0となります。a<bも同様に、bがaより大きいとき真、それ以外の時偽となります。

#include <stdio.h>
int main(void){
	int a,b;
	puts("a=?");
	scanf("%d",&a);
	puts("b=?");
	scanf("%d",&b);
	printf("a>b=%d\na<b=%d\n",a>b,a<b);
	if (a>b) puts("a>bは真です。");
	else puts("a>bは偽です。");
	return 0;
}

実行結果1

a=?
2
b=?
3
a>b=0
a<b=1
a>bは偽です。

実行結果2

a=?
100
b=?
10
a>b=1
a<b=0
a>bは真です。

>= <= 演算子

数学では大きい小さいだけでなく以上以下を表す(つまり等しいときも含む)≧、≦という記号がありました。C言語にも同じ意味を持つ演算子があります。

a>=bは、aがbと同じまたはbより大きいときに真、それ以外の時偽となります。a<=bは、aがbと同じまたはbより小さいときに真、それ以外の時偽となります。

== !=演算子

大小を比較する演算子があるので当然、値が等しいか等しくないかを判定する演算子も存在します。

a==bはaとbが等しいときに真、それ以外の時偽となります。a=bではないことに注意してください。a=bはaにbを代入する演算子で、この式を評価すると代入後のaの値になります。つまりa=bと書いてしまうとbの値が0でないとき真となります。バグの温床になるので、コンパイラによってはif文の中でa=bとすると警告を出すものも存在します。

a!=bはaとbが等しくないときに真、それ以外の時偽となります。!は否定の意味です。

サンプルコード

#include <stdio.h>
int main(void){
	int a,b;
	puts("a=?");
	scanf("%d",&a);
	puts("b=?");
	scanf("%d",&b);
	if (a>=b) puts("a>=bは真です。"); else puts("a>=bは偽です。");
	if (a<=b) puts("a<=bは真です。"); else puts("a<=bは偽です。");
	if (a==b) puts("a==bは真です。"); else puts("a==bは偽です。");
	if (a!=b) puts("a!=bは真です。"); else puts("a!=bは偽です。");
	return 0;
}

実行結果1

a=?
10
b=?
20
a>=bは偽です。
a<=bは真です。
a==bは偽です。
a!=bは真です。

実行結果2

a=?
5
b=?
5
a>=bは真です。
a<=bは真です。
a==bは真です。
a!=bは偽です。

まとめ

if文を使用すると、条件式が真(0以外)のときのみに処理を行うことができる。

elseブロックの中は、条件式が偽(0)のときに実行される。

条件式の中には、演算子<,>,==,!=などが使用できる。=一つだけだと、単なる代入式になるので注意。

コメント