1. ホーム
  2. c++

[解決済み] if (0)でswitchのcaseをスキップするのはうまくいくのでしょうか?

2022-08-06 07:46:29

質問

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++ なのでしょうか。それは、それが行うことを想定していますか?

どのように解決するのですか?

はい、これは許可されていますし、あなたが望むことを行います。例えば switch ステートメントでは、C++ 標準の は言う :

caseとdefaultのラベルはそれ自体では制御の流れを変えることはなく、そのようなラベルを越えて妨げられることなく継続されます。スイッチから抜けるには、breakを参照してください。

[注1:通常、スイッチの対象となるサブステートメントは複合的であり、ケースとデフォルトのラベルは(複合)サブステートメントに含まれるトップレベルのステートメントに表示されますが、これは必須ではありません。宣言はswitch文のサブステートメントに表示することができる。- エンドノート]。

そのため if 文が評価されると、制御フローは if ステートメントのルールに従って進みます。