
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 int | enum |
|---|---|---|
| 意味 | 値を書き換えられない変数 | 列挙された定数 |
| 型 | int 型の変数 | 列挙型の定数 |
| case に使用 | 原則不可 | 可能 |
| switch との相性 | △ | ◎ |
ポイントはここ👇
switch 文で使う定数は enum を選ぶのが正解!
なぜ enum は OK なの?🤔
enum の定数は、
- コンパイル時に値が確定する。
- 仕様上「列挙定数」として特別扱いされている。
という理由で、
case ラベルに書いてよい存在 と定義されています。
一方 const int は、
- 書き換え不可なだけの「変数」
という扱いなので、
仕様的には case に書けないんですね。
実務での使い分けの目安💼
最後に、実務での考え方をまとめます。
- switch 文の分岐条件 → enum
- 単なる読み取り専用の数値 → const
- 「状態」「種類」「モード」 → enum
この感覚を持っておくと、
コード設計が一段レベルアップ しますよ😊
