Ihoronir
Web

【C言語】switch文のフォールスルーの便利かもしれない使い方

この記事の公開日:
この記事の最終編集日:

まえがき

switch 文のフォールスルーの便利かもしれない使い方を発見したので紹介します。 使用するプログラミング言語はC言語です。

一般的には switch 文でフォールスルーを使うことはバグの温床として忌避されているような気がするので、 そういった意味では今回紹介するコードはあんまり良くないかもしれないですが、 まあ話半分で読んでもらえたらなと思います。 (いい加減ですみません!)

フォールスルーとは

そもそもフォールスルーというのは、 「 switch 文で break を書かなかった場合に制御が switch 文から抜け出さず、 後続の case に続く文が実行される。 」ことを指します。 次に示すコードが例です。

#include <stdio.h>
int main(void) {
    int num;
    scanf("%d", &num);
    switch (num) {
        case 1: puts("hoge");
        case 2: puts("fuga");
        case 3: puts("foo"); break;
        case 4: puts("bar");
    }
    return 0;
}
# 入力
1
# 出力
hoge
fuga
foo

入力が 1 だったので switch 文の中の case 1: 以降の文が、 break が登場するまで実行されました。 こんな感じで case に対応する break を意図的に省くことで、 制御が次の case へと落ちていくようなプログラムを書くことができます。 これがフォールスルーです。

フォールスルーを使うと「日付を入力するとその日がその年の何日目かを出力するプログラム」をシンプルに書けるということに気づいたので、 実装例を紹介します。

実装例

以下が switch 文のフォールスルーを使った「日付を入力するとその日がその年の何日目かを出力するプログラム」の実装例です。 (うるう年は考慮していません)

#include <stdio.h>
int main(void) {
    int month, day;
    int count = 0;
    scanf("%d %d", &month, &day);
    switch (month - 1) {
        case 11: count += 30;
        case 10: count += 31;
        case 9: count += 30;
        case 8: count += 31;
        case 7: count += 31;
        case 6: count += 30;
        case 5: count += 31;
        case 4: count += 30;
        case 3: count += 31;
        case 2: count += 28;
        case 1: count += 31;
    }
    count += day;
    printf("%d\n", count);
    return 0;
}
# 入力
12 31
# 出力
365

フォールスルーを使ったおかげで、 結構シンプルに実装できているのではないでしょうか。

補足:配列や繰り返しを使わなかった理由

この実装は大学の課題で作成したあるプログラムの一部で使用したものなんですが、 大学の授業ではまだ配列や繰り返しを扱っておらず、 課題でそれらの機能を使ってはいけないという縛りがあったため、 配列や繰り返しは使いませんでした。

結果的にこの縛りのおかげでフォールスルーの面白い使い方を見つけられたので良かったんではないでしょうか。 (何目線)

あとがき

プログラムを書くのって面白いですね!