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文がより活躍します。使いこなせばプログラムの幅が格段に広がります。