C言語入門|constではダメ?switch文はenumと相性バツグン!

「switch 文の case に数字を書くの、
正直ちょっと分かりにくいよね…🤔」

1 とか 2 とか 3 が並んでいても、
それが何を意味しているのかは
コードを読む人の頭の中にしか存在しません

そこで登場するのが 定数 です✨
数値に「意味のある名前」を付けることで、
コードは一気に読みやすくなります。

…が、ここで C言語ならではの落とし穴 が待っています😅

switch文 × 定数の基本アイデア💡

まずは、定数を使って
switch 文を分かりやすくした例を見てみましょう。

サンプルプログラム(const 定数を使った例)

プロジェクト名:5-4 ソースファイル名: sample5-4-1.c

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(void)
{
    const int MORNING = 1;
    const int NOON    = 2;
    const int NIGHT   = 3;

    srand((unsigned)time(NULL));
    int timeZone = rand() % 3 + 1;

    switch (timeZone) {
    case MORNING:
        printf("おはようございます\n");
        break;
    case NOON:
        printf("こんにちは\n");
        break;
    case NIGHT:
        printf("こんばんは\n");
        break;
    }

    return 0;
}

数字だけの switch 文より、
何を分岐しているのかが一目で分かりますよね😊

…でも、実はこれ「正しくない」かも?😨

このコード、
コンパイラによっては警告やエラーになる可能性 があります。

「えっ!? const って定数でしょ?」
「なんで case に使っちゃダメなの?」

そう思いますよね。
ここが C言語のややこしいポイントです💦

switch文の case に書けるもの📏

C言語の仕様では、
switch 文の case ラベルには
次のものしか書けない と決められています。

種類使用可否
整数リテラルOK
列挙定数(enum)OK
const int 定数❌(仕様上は不可)
変数

つまり、

case 1:

は OK ですが、

case MORNING:

MORNING が const int の場合、正式にはアウト なんです⚠️

一部のコンパイラは
「まあええやろ😉」
と通してくれますが、
処理系依存のコード になってしまいます。

じゃあどうする?答えは enum!✨

ここで活躍するのが 列挙型(enum) です。

enum は、
switch 文で使うために生まれてきたと言ってもいい存在
なんですよ😊

enum を使ったスッキリ解決例🎉

先ほどのプログラムを、
enum を使って書き直してみましょう。

サンプルプログラム(enum 版)

プロジェクト名:5-4-2 ソースファイル名: sample5-4-2.c

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

enum TimeZone {
    MORNING = 1,
    NOON,
    NIGHT
};

int main(void)
{
    srand((unsigned)time(NULL));
    int timeZone = rand() % 3 + 1;

    switch (timeZone) {
    case MORNING:
        printf("おはようございます\n");
        break;
    case NOON:
        printf("こんにちは\n");
        break;
    case NIGHT:
        printf("こんばんは\n");
        break;
    }

    return 0;
}

これなら、

  • C言語の仕様に完全準拠
  • 可読性バツグン
  • コンパイラ依存の心配なし

と、いいことづくめです✨

const と enum の違いを整理しよう🧠

ここで一度、
const 定数と enum 定数の違い を表で整理してみましょう。

項目const intenum
意味値を書き換えられない変数列挙された定数
int 型の変数列挙型の定数
case に使用原則不可可能
switch との相性

ポイントはここ👇

switch 文で使う定数は enum を選ぶのが正解!

なぜ enum は OK なの?🤔

enum の定数は、

  • コンパイル時に値が確定する。
  • 仕様上「列挙定数」として特別扱いされている。

という理由で、
case ラベルに書いてよい存在 と定義されています。

一方 const int は、

  • 書き換え不可なだけの「変数」

という扱いなので、
仕様的には case に書けないんですね。

実務での使い分けの目安💼

最後に、実務での考え方をまとめます。

  • switch 文の分岐条件 → enum
  • 単なる読み取り専用の数値 → const
  • 「状態」「種類」「モード」 → enum

この感覚を持っておくと、
コード設計が一段レベルアップ しますよ😊