パソナについて
記事検索

【ソースコードあり】C言語のif文 − else/and/orなども併せて解説

今回はif文による条件分岐の基礎的な文法のほか、「else」や「AND条件」、「OR条件」の書き方などについても併せて解説します。

【ソースコードあり】C言語のif文 − else/and/orなども併せて解説

今回はif文による条件分岐の基礎的な文法のほか、「else」や「AND条件」、「OR条件」の書き方などについても併せて解説します。

スキルアップ

2022/03/24 UP

C言語で使われる「if文」は、「条件分岐」を可能にする基本的な文法の一つです。「条件式」と呼ばれる式の値によって、プログラムの処理を分岐させることができます。使い方しだいで、複雑な条件分岐が必要なプログラムも書けるようになるでしょう。

今回はif文による条件分岐の基礎的な文法のほか、「else」や「AND条件」、「OR条件」の書き方などについても併せて解説します。

if文の書き方

if文の基本的な文法は、以下のとおりです。

if (条件式)
{
    /* 条件式が成立したときに実行される処理 */
}

if文では、「条件式」の部分に記述された式の値が「0以外」になる場合に限り、指定の処理が実行されます。この仕組みにより、プログラム中に特定の条件が成立した場合にだけ実行する部分を作ることが可能です。

条件式を判定する真偽値とは

条件式における0以外かどうかという判定は、C言語のプログラム中でif文に限らず用いられる方法です。このような判定に用いられる値のことを、「真偽値」といいます。

真偽値は、次の2つの値のどちらかです。

・真(true):式の値が0以外のとき

・偽(false):式の値が0のとき

これを踏まえてif文を説明すると、「式の値が真と判定された場合の処理を記述する」方法だといえます。

具体的な動作を理解するために、次のプログラムを見てみましょう。

int a = 1;
if (a)
{
    printf("変数aは真です。\n");
}

この場合、変数aの値は真と判定されるため、printf()により画面にメッセージが表示されます。

では、次の場合はどうでしょうか。

int b = 0;
if (b)
{
    printf("変数bは偽です。\n");
}

変数bの値は偽と判定されるため、printf()は実行されません。偽のときにメッセージを表示するプログラムにしたい場合は、次のように記述できます。

int b = 0;
if (!b)
{
    printf("変数bは偽です。\n");
}

条件式に「!」がついているのがわかるでしょうか。これは否定(NOT)を表す演算子で、真と偽の判定を逆転させる作用があります。

条件式に使用できる関係演算式

条件式には、「等値演算子」や「関係演算子」を用いた式を書くこともできます。

等値演算子は、以下の2種類です。

・==:左右の値が等しい場合に真

・!=:左右の値が等しくない場合に真

次のプログラムを見てみましょう。

int a = 123;
int b = 456;
if (a != b)
{
    printf("変数aと変数bは等しくありません。\n");
}

この例では変数aの値「123」と変数bの値「456」は等しくないため、条件式「a != b」は真と判定されます。

関係演算子は、以下の4種類です。

・>:左の値が右の値より大きい場合に真

・<:左の値が右の値より小さい場合に真

・>=:左の値が右の値以上の場合に真

・<=:左の値が右の値以下の場合に真

これらは、次のようにして使います。

int a = 123;
int b = 456;
if (a < b)
{
    printf("変数aは変数bより小さいです\n");
}

変数aの値「123」は変数bの値「456」より小さいため、条件式「a < b」は真と判定されることがわかるでしょう。

if文の多分岐elseの使い方

ここまでで説明したif文は、特定の条件が成立した場合に処理を「実行する」か「実行しない」かを選択するものでした。if文には、さらに分岐先を増やすための「else」という書き方があります。

elseの使い方を理解するために、次のプログラムを見てみましょう。

if (a == b)
{
    printf("変数aと変数bは等しいです。\n");
}
else
{
    printf("変数aと変数bは等しくありません。\n");
}

if文にelseをつけると、条件式が偽と判定された場合にelseの続きの処理が実行されます。つまり、特定の条件を指定して「成立する場合はこちら、そうでない場合はこちら」というように処理を分岐させられるのです。

else if文の書き方

if文では、条件式の判定結果に応じて実行する処理のなかに、さらにif文を書くことも可能です。このような書き方のことを「入れ子」といいます。

以下は、if文を入れ子にした例です。

int a = 3;
if (a == 0)
{
    printf("変数aは0です。\n");
}
else {
    if (a == 1)
    {
        printf("変数aは1です。\n");
    }
    else {
        if (a == 2)
        {
            printf("変数aは2です。\n");
        }
        else {
            printf("変数aは0〜2ではありません。\n");
        }
    }
}

複数のif文とelseを組み合わせて、変数aの値を次々にチェックしている様子がわかるでしょう。

しかし、上のような書き方は、やや読みづらいところがあります。そこで、「else if」を使って、もう少し読みやすいプログラムにしてみましょう。

int a = 3;
if (a == 0)
{
    printf("変数aは0です。\n");
}
else if (a == 1)
{
    printf("変数aは1です。\n");
}
else if (a == 2)
{
    printf("変数aは2です。\n");
}
else {
    printf("変数aは0〜2ではありません。\n");
}

この書き方は、元のプログラムからelseのあとの中かっこ(「{」と「}」)を省き、改行と字下げを調節しただけのものです。プログラムとしての意味は同じですが、すっきりと見やすくなっていることがわかるでしょう。

このように、「else if」では条件式を上から順に判定しながら処理を分岐させられます。条件式の個数は、「else if」を追加すれば好きなだけ増やすことが可能です。

複数の条件を持つif文の書き方

if文では、条件式を「論理演算子」で接続することで、いちどに複数の条件を用いた判定も行なえます。

論理演算子は、以下の2種類です。

・&&:AND条件が成立した場合に真

・||:OR条件が成立した場合に真

意味合いとしては、「&&」は「かつ」、「||」は「または」に相当します。それぞれの使い方について、詳しく見ていきましょう。

AND条件のif文の書き方

「AND」とは、2つの真偽値がどちらも真の場合に、結果を真とする演算です。

意味を理解するために、次のプログラムを見てみましょう。

srand(time(NULL));
int num = rand() % 10 + 1; /* 1〜10のランダムな値 */

if ((num % 2 == 0) && (num > 7))
{
    printf("numは8か10です。\n");
}
else {
    printf("numは8でも10でもありません。\n");
}

プログラムの冒頭部分は、変数numに1〜10の範囲のランダムな値を格納する処理です。現在時刻を用いて乱数の初期化を行なったあと、rand()で得た乱数を10で割った余りに1を足してnumに格納しています。

その次にあるif文の条件式が、AND条件になっていることがわかるでしょうか。ここでは、「num % 2 == 0」と「num > 7」という2つの条件式が「&&」で接続されています。

「num % 2 == 0」は、numを2で割った余りが0、つまりnumが偶数かどうかを判定する式です。これと「num > 7」、つまりnumが7より大きいという条件をどちらも満たすのは、numが8か10の場合だけとなります。

OR条件のif文の書き方

「OR」とは、2つの真偽値のいずれかが真の場合に、結果を真とする演算です。

次のプログラムで、ANDとの違いを確認しましょう。

srand(time(NULL));
int num = rand() % 10 + 1; /* 1〜10のランダムな値 */

if ((num % 5 == 0) || (num % 7 == 0))
{
    printf("numは5か7か10です。\n");
}
else {
    printf("numは5でも7でも10でもありません。\n");
}

プログラムの冒頭部分で、変数numに1〜10のランダムな値を格納している点は、ANDのプログラムと同様です。

その次にあるif文の条件式が、OR条件になっています。ここでは、「num % 5 == 0」と「num % 7 == 0」という2つの条件式が「||」で接続されていることがわかるでしょう。

それぞれ、「numが5の倍数か」と「numが7の倍数か」を判定する式です。この2つのいずれかを満たすのは、numが5か7か10の場合だけとなります。

breakとcontinueでfor文を制御する

if文は、ループの制御にも用いられます。ここでは、「for文」と組み合わせた使用例を紹介しましょう。

for文は、次のような形をしています。

for (int i = 0; i < 5; i++) {
    printf("%d回目の処理です。\n", i + 1);
}
printf("処理が終了しました。\n");

この例は、変数iを0〜4まで1ずつ増やしながら、合わせて5回のループを実行するというものです。ループ中では現在何回目の処理なのかを画面に表示し、ループが終わると終了メッセージを表示します。このプログラムを、if文を用いた2つの方法で制御してみましょう。

1つ目は、「break」を用いた制御です。

サンプルコード:

#include <stdio.h>

int main(void) {
    for (int i = 0; i < 5; i++) {
        if (i + 1 > 3) {
            break;
        }
        printf("%d回目の処理です。\n", i + 1);
    }
    printf("処理が終了しました。\n");

    return 0;
}

実行結果:

1回目の処理です。
2回目の処理です。
3回目の処理です。
処理が終了しました。

ループの内側にif文を追加し、「i + 1 > 3」という条件が成立したときにbreakが実行されるようにしました。for文のなかでbreakが実行されると、その場でループが終了して次の処理に移るという動作をします。つまり、この例では4回目の処理にさしかかった時点でループを抜けて、終了メッセージが表示されるということです。

次は、2つ目の制御方法である「continue」について見てみましょう。

サンプルコード:

#include <stdio.h>

int main(void) {
    for (int i = 0; i < 5; i++) {
        if (i + 1 < 3) {
            continue;
        }
        printf("%d回目の処理です。\n", i + 1);
    }
    printf("処理が終了しました。\n");

    return 0;
}

実行結果:

3回目の処理です。
4回目の処理です。
5回目の処理です。
処理が終了しました。

今度はループの内側のif文で、「i + 1 < 3」という条件が成立したときにcontinueが実行されるようにしました。for文のなかでcontinueが実行されると、ループ中の今回の処理を終了して、次回の処理に移るという動作をします。つまり、この例では2回目の処理までは何も表示せず、3回目以降の処理では現在がループの何回目なのかを表示するということです。

ifを使いこなすことで複雑な条件分岐が可能になる

C言語のif文は、条件式の真偽値によってプログラムの処理を分岐させるためのものです。elseと組み合わせれば、複数の条件を順番に判定しながら多数の分岐先に処理を移すこともできます。

条件式では、2つの値を比較する等値演算子や関係演算子を利用可能です。複数の条件をいちどに指定したい場合は、AND条件やOR条件を活用するとよいでしょう。また、breakやcontinueと組み合わせて、ループの制御に用いる使い方もあります。

さまざまな条件の指定方法を覚えて、if文を使いこなせるようにしましょう。