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;
}