Cのswitch文の特殊なケースについて

C言語にはいわゆるswitch文というものがありますが、Cの仕様書を読んでたら知らない記法が許容されていたので個人的メモ。

switch文の文法は以下のようになっている。

switch ( expression ) statement

なるほど、switchのparenの後はbraceから始まるブロック(compound-statement)だけではなくstatementを置けるらしい。

ということは、

switch (1) printf("Hello, World\n");

のような記述も正しく、gccコンパイルが通った。(ただしprintfは実行されない)

ところで、以下のようなコードを実行しても結果として何も表示されない。

switch (0)
case 1:
  printf("Hello, World\n");

一方、次のようなコードではprintfが実行される。

switch (0)
case 1:
  printf("Hello, World\n");

なるほど。switch文は直後のstatement内に合致するcase(labeled-statement)があればそこに飛ぶ(特殊なgoto?)。ただそれだけのようだ。
そう考えると飛んだ後の実行は普通に次の行に行くため、break文が無いとfall throughするという一見妙な挙動も納得する。

新たにコードを示す。

  switch (0) {
    int i = 1;
  default:
    printf("%d\n", i);
  }

ここではswitch文のcompound-statement内の最初の行にて変数iが定義、初期化されている。
この時点で少し変わったコードだが、先ほどの流れからするとこれが文法上問題ないことも納得できる。

ただし実行時には変数iの初期化は実行されないため、defaultラベル内ではiの値は不定になる。

参考文献

N1570 April 12, 2011 ISO/IEC 9899:201x