C言語の基本|if~else文の使い方

真ならこちら、偽ならあちら。if~else文で、どちらの結果にもきちんと応えるプログラムを作ろう。

プログラムでは、条件を満たした場合だけでなく、満たさなかった場合にも処理が必要になることがあります。

たとえば、入力された値を確認するときには、次のような2つの結果が考えられます。

  • 正しい値なら処理を続ける
  • 正しくない値なら警告を表示する

if文だけを使った場合、条件が偽になるとブロック内の処理は実行されません。そこで、偽だった場合の処理も指定できるif~else文を使います。

if~else文は、条件によって処理を2つに分けたいときにぴったりの制御文です。

図1:if文とif~else文の違い

この図から分かること

if文では、条件が偽になると指定した処理を行わず、そのまま次へ進みます。一方のif~else文では、条件が真でも偽でも、それぞれに対応する処理があります。

そのため、判定結果を必ず表示したい場合や、成功と失敗の両方に対応したい場合には、if~else文が適しています。

if~else文の基本構文

if~else文は、次の形で記述します。

if (条件式) {
    文1;
} else {
    文2;
}

処理の流れは次のとおりです。

  1. 条件式を評価する
  2. 条件が真なら文1を実行する
  3. 条件が偽なら文2を実行する
  4. 選ばれなかった側の文は実行しない
  5. 分岐後の処理へ進む

ifブロックとelseブロックが両方実行されることはありません。条件式の結果によって、必ずどちらか一方だけが選ばれます。

C言語における真と偽

if~else文の条件式は、真または偽として判定されます。C言語では、数値の0と0以外によって判定が決まります。

条件式の値判定実行される処理
0elseブロック
0以外ifブロック

通常は、関係演算子や論理演算子を使って条件式を作ります。

演算子意味条件式の例
==等しいvalue == 10
!=等しくないvalue != 0
<より小さいvalue < 20
<=以下value <= 100
>より大きいvalue > 0
>=以上value >= 60
&&両方の条件を満たすvalue >= 0 && value <= 100
||どちらかの条件を満たすvalue < 0 || value > 100

たとえばvalue >= 0 && value <= 100は、valueが0以上であり、さらに100以下であるかを調べる条件式です。両方を満たしたときだけ真になります。

ifとelseの処理は対になっている

if~else文を読むときは、if側とelse側を対にして考えると分かりやすくなります。

条件式の結果選ばれる側選ばれない側
ifブロックelseブロック
elseブロックifブロック

たとえば、入力された湿度が快適な範囲に入っているかを調べる場合は、次のように役割を分けられます。

  • if側では、快適な範囲であることを表示する
  • else側では、快適な範囲外であることを表示する

図2:条件によって2つの処理に分かれる流れ

この図から分かること

条件式が真ならif側、偽ならelse側へ進みます。どちらかの処理を終えると、プログラムは分岐の後にある共通の処理へ戻ります。

if~else文はプログラムを完全に別々のものへ分ける仕組みではありません。一時的に処理を2つに分け、選ばれた側の処理が終わった後で流れを再び1つに戻す仕組みです。

波かっこを両方に付ける理由

ifブロックやelseブロックの処理が1文だけの場合、波かっこを省略することもできます。しかし、学習中は1文だけでも波かっこを付ける書き方がおすすめです。

if (条件式) {
    文1;
} else {
    文2;
}

波かっこを付けておくと、次の点が分かりやすくなります。

  • if側に含まれる処理の範囲
  • else側に含まれる処理の範囲
  • 後から処理を追加する場所
  • 字下げと制御構造の対応

字下げはプログラムの実行結果を直接変えるものではありませんが、処理のまとまりを読み取るために大切です。ifとelseの内側は、同じ幅で字下げすると構造が見やすくなります。

湿度が快適な範囲かを判定して表示する

次のプログラムでは、入力された湿度が40%以上60%以下であるかを判定します。範囲内と範囲外のどちらの場合にも結果を表示します。

湿度の範囲をif~else文で判定するプログラム

ファイル名:8_4_1.c

#include <stdio.h>

int main(void)
{
    double humidity;

    printf("室内の湿度(%%)を入力してください > ");
    scanf("%lf", &humidity);

    /* 湿度が40%以上60%以下であるかを判定する */
    if (humidity >= 40.0 && humidity <= 60.0) {
        printf("快適な湿度の範囲です。\n");
    } else {
        printf("快適な湿度の範囲外です。\n");
    }

    return 0;
}
実行結果の例

湿度が範囲内の場合は、ifブロックが実行されます。

室内の湿度(%)を入力してください > 48.5
快適な湿度の範囲です。

湿度が範囲外の場合は、elseブロックが実行されます。

室内の湿度(%)を入力してください > 72.0
快適な湿度の範囲外です。
プログラムの詳しい解説

humidityは、小数を含む湿度を保存するためのdouble型変数です。scanfではdouble型の入力を受け取るため、変換指定子に%lfを使用しています。

double humidity;

続くif文では、2つの条件を&&で組み合わせています。

humidity >= 40.0 && humidity <= 60.0

それぞれの条件には次の意味があります。

  • humidity >= 40.0は、湿度が40.0以上かを調べる
  • humidity <= 60.0は、湿度が60.0以下かを調べる
  • &&は、左右の条件を両方満たしているかを調べる

したがって、全体では湿度が40.0から60.0までの範囲に入っているかを判定しています。

たとえば48.5を入力すると、48.5は40.0以上であり、60.0以下でもあります。両方の条件が真なので、ifブロックが実行されます。

72.0を入力した場合、40.0以上という条件は満たしますが、60.0以下という条件は満たしません。&&で結ばれた条件は片方でも偽になると全体が偽になるため、elseブロックが実行されます。

境界値が結果を左右する

範囲を判定するときは、境界となる値を含めるかどうかが重要です。

今回の条件では、>=と<=を使っています。

humidity >= 40.0 && humidity <= 60.0

そのため、40.0と60.0はどちらも範囲内です。

入力した湿度40.0以上60.0以下全体の判定実行される側
39.9else
40.0if
50.0if
60.0if
60.1else

もし40.0を含めたくない場合は、humidity > 40.0と書きます。60.0を含めたくない場合は、humidity < 60.0と書きます。

条件式を作る前に、次の点を決めておくと演算子を選びやすくなります。

  • 下限はいくつか
  • 上限はいくつか
  • 下限の値を範囲に含めるか
  • 上限の値を範囲に含めるか
  • 両方の条件を満たす必要があるか

elseには条件式を書かない

elseは、ifの条件式が偽だった場合をすべて受け持ちます。そのため、elseの後ろに条件式を書く必要はありません。

考え方は次のようになります。

  • ifで範囲内かを判定する
  • 条件を満たせばif側を実行する
  • 条件を満たさないすべての場合はelse側を実行する

今回の条件では、40.0未満と60.0より大きい値が、まとめてelse側に入ります。

ifだけの場合との使い分け

if文とif~else文は、偽だった場合に処理が必要かどうかで使い分けられます。

書き方条件が真の場合条件が偽の場合向いている場面
if文指定した処理を行う何もせず次へ進む必要なときだけ警告する
if~else文if側を実行するelse側を実行するどちらの場合も結果を示す

異常な場合だけ警告を出したいなら、if文だけでも十分です。一方、正常か異常かを必ず利用者へ伝えたい場合は、if~else文のほうが意図を表しやすくなります。

条件が逆にならないように確認する

if~else文では、if側に書いた条件と表示内容が一致していないと、結果が反対になってしまいます。

今回の設計は次の組み合わせです。

  • 条件式は快適な範囲に入っているかを調べる
  • if側には快適な範囲であることを表示する
  • else側には快適な範囲外であることを表示する

条件を作った後は、範囲内の値と範囲外の値を1つずつ当てはめて確認すると安心です。

  • 50.0を当てはめると、if側へ進む
  • 30.0を当てはめると、else側へ進む
  • 40.0と60.0を当てはめると、境界の扱いを確認できる

図3:境界値を使った条件式の確認

この図から分かること

40.0以上60.0以下という条件では、40.0と60.0もif側に含まれます。範囲の外側にある39.9や60.1は条件式が偽になるため、else側へ進みます。

if~else文を正しく使うには、条件式だけを見るのではなく、境界値がどちらへ進むのかまで確認することが大切です。下限、上限、そのすぐ外側の値を試すと、条件の向きや演算子の間違いを見つけやすくなります。