if・else分を使うと複数の条件によって処理を分岐できます。
記事の内容
- if・else文を用いた複数条件の分岐
- 処理が1つの時の省略した書き方
- 入れ子(ネスト)構造
- 条件式の書き方と演算子(等号・比較・AND・OR・否定)
- 条件式の真偽値とは何か
if・else文を用いた複数条件の分岐
条件分岐とは条件によって処理を分けることです。
例:
#include <stdio.h>
void main()
{
int a=1;
if(a==0) //aが0かチェック、偽なので次のelse ifに飛ぶ
{
printf("a is 0\n"); //実行されない
}
else if(a>0) //aが0より大きいかチェック、真なので{ }内の処理を実行
{
printf("a is plus\n"); //画面に文字を表示してif・else文から抜ける
}
else //無視される
{
printf("a is minus\n"); //無視される
}
printf("end\n");
}
実行結果
a is plus
end
真とは条件に合うという意味で、偽とは条件に合わないという意味です。
例では変数aの値が0、正の数、負の数それぞれの場合で処理を分けています。
if・else文では( )内に書かれた条件が真か偽かチェックし、偽であれば直後の{ }内の処理は飛ばして次のelse ifまたはelse文を見に行きます。真であれば直後の{ }内の処理を実行し、残りのif・else文は無視されます。
if・elseの使い方
if (条件式1)
{
処理(条件式1が真ならば実行)
}
else if(条件式2)
{
処理(条件式2が真ならば実行)
}
else
{
処理(条件式1も2も偽のときに実行)
}
else ifを増やすことで条件式はいくつでも増やせます。else if文とelse文は無しでif文だけでもOKです。
if・else文で処理が1つの時の省略した書き方
条件式が真だった場合に実行する処理が1つなら省略して書けます。例えば上の例文は以下のように書き直せます。
例:
#include <stdio.h>
void main()
{
int a=1;
if(a==0) printf("a is 0\n");
else if(a>0) printf("a is plus\n");
else printf("a is minus\n");
printf("end\n");
}
実行結果
a is plus
end
条件式の後にスペースで区切り、真の場合に実行される処理を1つだけ書きます。2つ以上の処理を1行に書くことはできません。
if・else文の入れ子(ネスト)構造
入れ子(ネスト)構造とはif・else文の中にさらにif・else文を書くことです。
例:
#include <stdio.h>
void main()
{
int a=1, b=0;
if(a==0)
{
printf("a is 0\n");
}
else
{
if(b==0)
{
printf("b is 0\n");
}
else
{
printf("a*b = %d\n",a*b);
}
}
}
実行結果
b is 0
入れ子構造は複数の変数を元に条件を分けたいときに使えます。
ただし何重にも入れ子にすると見づらいコードになってしまいます。見やすくするにはコーディングを工夫して3重くらいでやめておくのがいいかと思います。
条件式の書き方と演算子(等号・比較・AND・OR・否定)
条件式とはif・else文の( )内に書く式です。条件式で主に使う演算子と使用例はこちらです。
| 演算子 | 使用例 | 意味 |
| == | a==0 | aが0に等しいと真 |
| != | a!=0 | aが0でないと真 |
| < | a<0 | aが0より小さいと真 |
| <= | a<=0 | aが0以下だと真 |
| > | a>0 | aが0より大きいと真 |
| >= | a>=0 | aが0以上だと真 |
| && | a==0 && b==0 | a=0かつb=0ならば真 |
| || | a==0 || b==0 | a=0またはb=0ならば真 |
| ! | !(a==0) | aが0に等しくなければ真 |
等しい場合の条件式はa==0のようにイコールを二重に書きます。しかし間違えてa=0のように書いてもエラーが出ない上にaに0が代入されてしまうので注意です。(よくあるミス)
複数の条件式を使う場合は( )でくくることで優先的に条件判定できます。
例:
#include <stdio.h>
void main()
{
int a=1, b=-1, c=1;
if(a==0 && b>0 || c>0) //真
{
printf("if1\n");
}
if(a==0 && (b>0 || c>0)) //偽
{
printf("if2\n");
}
}
実行結果
if1
2つあるif文の条件式は「b>0 || c>0」を( )でくくるか否か以外は同じです。しかし実行結果にはif1のみ表示されます。
1つ目のif文の条件式ではまず「a==0 && b>0」が判定されます。bは負の数なのでこれは偽ですが、条件式は「|| c>0」と続いています。「c>0」は真なのでOR判定の結果は真です。
2つ目のif文の条件式ではまず( )でくくってある「b>0 || c>0」が判定されます。これは真ですが、まだ「a==0 &&」が残っています。「a==0」は偽なのでAND判定の結果は偽です。
このように( )でくくった条件式は優先的に判定されます。
条件式には算術演算子も使えます。例:if(a+b>0 && a-b<0)
条件式の真偽値とは何か

このような疑問を持った方もいらっしゃるかもしれません。実は真偽はプログラム内で以下のように定義されています。
真:0以外
偽:0
例:
#include <stdio.h>
void main()
{
int a=0;
if(0) printf("0\n"); //0なので偽
if(1) printf("1\n"); //0以外なので真
if(-1) printf("-1\n"); //0以外なので真
printf("a==0 is %d\n",a==0);
printf("a!=0 is %d\n",a!=0);
}
実行結果
1
-1
a==0 is 1
a!=0 is 0
if文の条件式に直接0を入れると処理は実行されませんが、0以外を入れると実行されます。
普段条件式に入れている「a==0」「a!=0」をprintfで出力してみるとそれぞれ1、0と出力されました。実は条件式も結果によって1(真)か0(偽)に分けられています。
まとめ
if・else文を使えば条件に合わせた複雑な処理が可能です。上の例では初期化した変数値をそのまま使って分岐していますが、キーボードから入力した値によって処理を変えたい場合などにはif・else文がより活躍します。使いこなせばプログラムの幅が格段に広がります。