記事には広告を含む場合があります。

C言語入門講座

【C言語】if・else文で複数条件分岐する方法と条件式の書き方

2022年5月14日

条件によって処理を分けるときはどうやって書けばいいの?

こんな疑問にお答えします。

記事の内容

  • if・else文で複数条件分岐するときの記述方法
  • 入れ子(ネスト)構造の書き方
  • 条件式に使う演算子
  • if・else文の省略した書き方
oyu
元エンジニアの筆者がシンプルにわかりやすく解説します。

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です。

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

ブログランキング参加中。クリックしてもらえると励みになります。

ブログランキング・にほんブログ村へ

-C言語入門講座