switch 内の case をスキップするために if (0) を使用するのは機能するはずですか? 質問する

switch 内の case をスキップするために if (0) を使用するのは機能するはずですか? 質問する

C++ の switch ステートメントの 2 つのケースを両方とも 3 番目のケースにフォールスルーさせたい状況があります。具体的には、2 番目のケースが 3 番目のケースにフォールスルーし、1 番目のケースも 3 番目のケースにフォールスルーします。それなし2番目のケースを通過します。

馬鹿げたアイデアを思いついて試してみたら、うまくいきました! 2 番目のケースをif (0) {...で包みました}。次のようになります。

#ifdef __cplusplus
#  include <cstdio>
#else
#  include <stdio.h>
#endif

int main(void) {
    for (int i = 0; i < 3; i++) {
        printf("%d: ", i);
        switch (i) {
        case 0:
            putchar('a');
            // @fallthrough@
            if (0) {        // fall past all of case 1 (!)
        case 1:
            putchar('b');
            // @fallthrough@
            }
        case 2:
            putchar('c');
            break;
        }
        putchar('\n');
    }
    return 0;
}

実行すると、希望の出力が得られます。

0: ac
1: bc
2: c

C と C++ (どちらも clang を使用) の両方で試してみましたが、同じ結果になりました。

私の質問は、これは有効な C/C++ ですか? これは、本来の機能を果たすはずですか?

ベストアンサー1

はい、これは動作するはずです。C の switch ステートメントの case ラベルは、goto ラベルとほぼ同じです (ネストされた switch ステートメントでの動作についてはいくつかの注意事項があります)。特に、case ラベル自体は、「case 内」にあると考えられるステートメントのブロックを定義しないので、goto の場合と同じように、ブロックの途中にジャンプするために使用できます。ブロックの途中にジャンプする場合、変数の初期化などをジャンプすることに関して、goto と同じ注意事項が適用されます。

そうは言っても、実際には次のように goto ステートメントを使用して記述する方がわかりやすいでしょう。

    switch (i) {
    case 0:
        putchar('a');
        goto case2;
    case 1:
        putchar('b');
        // @fallthrough@
    case2:
    case 2:
        putchar('c');
        break;
    }

おすすめ記事