フリーキーズ | 独学プログラミング

C言語における条件分岐の基本!初心者にもわかるif文とswitch文の使い方

最終更新日
リンドくん

リンドくん

たなべ先生、プログラミングの勉強を始めたんですが、「条件分岐」って何ですか?
C言語では「if文」と「switch文」があるみたいなんですけど…

たなべ

たなべ

条件分岐はプログラミングの基本中の基本なんだ。
簡単に言うと「もし〇〇なら××する」という判断をプログラムにさせる仕組みだよ。

今日はC言語での条件分岐について、わかりやすく説明していくね。

プログラミングに欠かせない条件分岐

こんにちは!プログラミング講師のたなべです。
プログラミングにおいて、条件分岐は基本的かつ重要な概念です。

C言語で学ぶ条件分岐は、他の言語でも応用できる基礎知識となります。
「もし雨が降っていたら傘を持っていく」というような日常的な判断をプログラムで表現するのが条件分岐なのです。

今回は、C言語における条件分岐の書き方と使い分けについて、実際のコード例を交えながらわかりやすく解説していきます。
このスキルを身につければ、より柔軟で賢いプログラムを作成できるようになりますのでしっかり理解していきましょう。

if文の基本

リンドくん

リンドくん

if文って、日本語の「もし〜なら」みたいなものですか?

たなべ

たなべ

その通り!if文は「もし○○という条件が成り立つなら、この処理を実行する」という命令なんだ。
英語の「if」がそのまま「もし〜なら」という意味だからわかりやすいよね。

if文の基本構文

if文は、C言語において最も基本的な条件分岐の方法です。
構文は以下のようになります。

if (条件式)
{
    // 条件が真(true)の場合に実行される処理
}

条件式には、比較演算子(==, !=, <, >, <=, >=)を使った式や、論理演算子(&&(AND), ||(OR), !(NOT))を使った複合条件などを記述できます。

if文の例

例えば、テストの点数によって合格か不合格かを判定するプログラムを考えてみましょう。

#include <stdio.h>

int main()
{
    int score = 75;  // テストの点数
    
    if (score >= 60)
    {
        printf("合格です!おめでとう!\n");
    }
    
    return 0;
}

この例では、点数が60点以上なら「合格です!おめでとう!」というメッセージが表示されます。とてもシンプルですね。

else文でさらに分岐させる

もちろん、条件を満たさなかった場合の処理も指定できます。それにはelseを使います。

if (score >= 60)
{
    printf("合格です!おめでとう!\n");
}
else
{
    printf("残念、不合格です。次回頑張りましょう。\n");
}

これで、60点以上なら合格のメッセージ、60点未満なら不合格のメッセージが表示されるようになりました。

複数の条件で分岐する(else if)

さらに条件を増やしたい場合は、else ifを使います。

if (score >= 90)
{
    printf("優秀です!A評価です!\n");
}
else if (score >= 70)
{
    printf("良好です。B評価です。\n");
}
else if (score >= 60)
{
    printf("合格です。C評価です。\n");
}
else
{
    printf("残念、不合格です。次回頑張りましょう。\n");
}

このように、複数の条件に応じて異なる処理を行うことができます。
条件は上から順に評価され、最初に真となった条件の処理だけが実行される点に注意しましょう。

論理演算子を使いこなす

リンドくん

リンドくん

複数の条件を一度に判定することもできるんですか?

たなべ

たなべ

もちろん!例えば「点数が60点以上かつ欠席が3回以下」という複合条件も表現できるんだよ。
それには論理演算子を使うんだ。

論理演算子とは

C言語では、複数の条件を組み合わせるために論理演算子を使います。主な論理演算子は以下の3つです。

  • && (AND) = 両方の条件が真の場合に真
  • || (OR) = どちらかの条件が真の場合に真
  • ! (NOT) = 条件の真偽を反転する

これらを使うことで、より複雑な判断が可能になります。

論理演算子の使用例

例えば、テストに合格するには「点数が60点以上」かつ「欠席が3回以下」という条件があるとします。

int score = 75;
int absences = 2;

if (score >= 60 && absences <= 3)
{
    printf("合格です!\n");
}
else
{
    printf("不合格です。\n");
}

また、「大雨警報が出ている」または「体調が悪い」場合は学校を休む、というプログラムも書けます。

int is_heavy_rain = 1;  // 1:大雨警報が出ている、0:出ていない
int is_sick = 0;        // 1:体調が悪い、0:体調は良い

if (is_heavy_rain || is_sick)
{
    printf("今日は学校を休みます。\n");
}
else
{
    printf("今日は学校に行きます。\n");
}

このように、論理演算子を使うことで、日常的な判断をプログラムで表現できるようになります。
これはプログラミングの大きな力の一つと言えるでしょう。

switch文

リンドくん

リンドくん

if文だけでもいろんな条件分岐ができるみたいですけど、switch文は何のためにあるんですか?

たなべ

たなべ

良い質問だね!switch文は特に「等しいかどうか」を判定する場合に便利なんだ。
例えば、メニューから選んだ番号によって処理を変えるようなケースでは、switch文の方がすっきりと書けるよ。

switch文の基本構文

switch文は、一つの変数や式の値によって多くの選択肢から処理を分岐させるときに便利です。

switch (式または変数)
{
    case1:
        // 値1の場合の処理
        break;  // breakがないと次のcaseも実行される
    case2:
        // 値2の場合の処理
        break;
    ...
    default:
        // どのcaseにも一致しない場合の処理
}

switch文の例

例えば、ユーザーが選んだメニュー番号に応じて異なる処理を行うプログラムを考えてみましょう。

#include <stdio.h>

int main() {
    int choice = 2;  // ユーザーが選んだメニュー番号
    
    switch (choice)
    {
        case 1:
            printf("新規ゲームを開始します。\n");
            break;
        case 2:
            printf("続きからゲームを再開します。\n");
            break;
        case 3:
            printf("設定画面を開きます。\n");
            break;
        case 4:
            printf("ゲームを終了します。\n");
            break;
        default:
            printf("無効な選択です。1~4の番号を選んでください。\n");
    }
    
    return 0;
}

この例では、変数choiceの値に応じて異なるメッセージが表示されます。
breakを忘れると、そのcase以降の処理も続けて実行されてしまうので注意が必要です。

breakを使わないやり方

ただし、意図的にbreakを省略することで、複数のケースで同じ処理を行うこともできます。

char grade = 'B';

switch (grade) {
    case 'A':
        printf("素晴らしい成績です!\n");
        break;
    case 'B':
    case 'C':
        printf("良い成績です。\n");
        break;
    case 'D':
        printf("合格ですが、もう少し頑張りましょう。\n");
        break;
    case 'F':
        printf("不合格です。再試験を受けてください。\n");
        break;
    default:
        printf("無効な成績です。\n");
}

この例では、成績が'B'または'C'の場合に「良い成績です。」というメッセージが表示されます。

if文とswitch文の使い分け

リンドくん

リンドくん

if文とswitch文、どっちを使えばいいか迷います…

たなべ

たなべ

それぞれに得意な場面があるんだ。
一般的な目安としては、単純な条件や範囲の判定はif文、特定の値との一致判定で分岐が多い場合はswitch文が向いているよ。実例を見てみよう!

if文が適している場面

以下のような場合は、if文の方が適しています。

  1. 範囲の判定: 数値が特定の範囲内かどうかを判定する場合

    if (temperature > 30)
    {
        printf("暑いです!\n");
    }
    else if (temperature > 20)
    {
        printf("快適です。\n");
    }
    else
    {
        printf("涼しいです。\n");
    }
  2. 複雑な条件: 論理演算子を使った複合条件の場合

    if (age >= 18 && hasLicense)
    {
        printf("運転できます。\n");
    }
  3. 異なる型の比較: 文字、数値、真偽値など異なる型の条件を混在させる場合

switch文が適している場面

以下のような場合は、switch文の方が適しています。

  1. 特定の値との一致判定: 変数が特定の値と等しいかどうかで分岐する場合

    switch (day)
    {
        case 1: printf("月曜日\n"); break;
        case 2: printf("火曜日\n"); break;
        // ...他の曜日も同様に...
    }
  2. 多くの分岐: 等価比較による分岐が多数ある場合

  3. 読みやすさを重視: メニュー選択のような明確な選択肢がある場合

if文/switch文コード比較

例えば、曜日ごとに異なるメッセージを表示するプログラムをif文とswitch文の両方で書いてみましょう。

if文での実装

if (day == 1)
{
    printf("月曜日:新しい週の始まりです。\n");
}
else if (day == 2)
{
    printf("火曜日:まだ週の初めです。\n");
}
else if (day == 3)
{
    printf("水曜日:週の真ん中です。\n");
}
else if (day == 4)
{
    printf("木曜日:もうすぐ週末です。\n");
}
else if (day == 5)
{
    printf("金曜日:週末の前日です!\n");
}
else if (day == 6 || day == 7)
{
    printf("週末:ゆっくり休みましょう。\n");
}
else
{
    printf("無効な曜日番号です。\n");
}

switch文での実装

switch (day)
{
    case 1:
        printf("月曜日:新しい週の始まりです。\n");
        break;
    case 2:
        printf("火曜日:まだ週の初めです。\n");
        break;
    case 3:
        printf("水曜日:週の真ん中です。\n");
        break;
    case 4:
        printf("木曜日:もうすぐ週末です。\n");
        break;
    case 5:
        printf("金曜日:週末の前日です!\n");
        break;
    case 6:
    case 7:
        printf("週末:ゆっくり休みましょう。\n");
        break;
    default:
        printf("無効な曜日番号です。\n");
}

この例では、switch文の方が構造的に整理されており、読みやすくなっています。

条件分岐で起こりがちなミスと対策

リンドくん

リンドくん

条件分岐で気をつけるべきことはありますか?

たなべ

たなべ

良い質問だね!初心者がよく陥るミスがいくつかあるんだ。
例えば、「==」と「=」の混同は特に注意が必要だよ。他にもいくつかポイントを紹介するね。

代表的なミスと対策

プログラミング初心者がよく陥る条件分岐のミスと、その対策を紹介します。

1. 「==」(等価演算子)と「=」(代入演算子)の混同

最も頻繁に起こるミスの一つが、比較のための「==」と代入のための「=」を混同することです。

// 誤った使用法(代入してしまっている)
if (x = 10) // xに10を代入し、その結果(10)は真と評価される
{
    // この処理は常に実行される
}

// 正しい使用法(比較している)
if (x == 10) // xが10と等しいかどうかをチェック
{
    // xが10の場合のみ実行される
}

2. 条件式の評価順序の誤解

論理演算子を使う際、評価順序を誤解することがあります。

// 危険な例
if (ptr != NULL && ptr->value > 0)
{
    // ptrがNULLの場合、ptr->valueにアクセスしようとしてエラーになる
}

// 安全な例
if (ptr != NULL) // 最初にNULLチェック
{
    if (ptr->value > 0) {
        // 安全にアクセスできる
    }
}

3. 「switch」文で「break」を忘れる

「switch」文で「break」を忘れると、意図しない「落下」(fall-through)が発生します。

// breakを忘れた例
switch (option)
{
    case 1:
        printf("オプション1を選択\n");  // breakがないので次のcaseも実行される
    case 2:
        printf("オプション2を選択\n");
        break;
}

4. 浮動小数点数の等価比較

浮動小数点数は誤差が生じる可能性があるため、厳密な等価比較は避けるべきです。

// 危険な比較
float a = 0.1 + 0.2;
if (a == 0.3) // 浮動小数点の誤差により、これは真にならないことがある
{
    printf("等しい\n");
}

// より安全な比較
if (fabs(a - 0.3) < 0.000001) // 許容誤差内かどうかをチェック
{
    printf("ほぼ等しい\n");
}

これらのミスに注意することで、より堅牢なプログラムを書けるようになります。
デバッグの時間も大幅に削減できるでしょう。

まとめ

リンドくん

リンドくん

条件分岐を使いこなせるようになると、どんなメリットがあるんですか?

たなべ

たなべ

大きなメリットがあるよ!条件分岐はプログラムに「判断力」を与えるんだ。
これによって、同じプログラムでも状況に応じて異なる動作ができるようになる。
例えば、ゲームでは、プレイヤーの入力や状態によって様々な処理を変えることができるようになるんだよ。

この記事では、C言語における条件分岐の基本、特にif文とswitch文の使い方について解説してきました。
ここで学んだ内容をおさらいしましょう。

  • if文は基本的な条件分岐で、特に範囲の判定や複雑な条件の表現に適しています。
  • elseelse ifを使うことで、複数の条件による分岐を表現できます。
  • 論理演算子&&, ||, !)を使うことで、複合条件を作ることができます。
  • switch文は、一つの変数や式の値に基づいて多くの選択肢から分岐させるのに適しています。
  • 状況に応じてif文とswitch文を適切に使い分けることが重要です。
  • 条件分岐では、「==」と「=」の混同や「break」の忘れなど、いくつかの落とし穴に注意する必要があります。

条件分岐は、プログラムに「知性」を与える重要な要素です。
これをマスターすることで、ユーザーの入力に応じた対応や、ゲームの状況に合わせた処理など、より柔軟で洗練されたプログラムを作成できるようになります。

関連するコンテンツ