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
の値は不定になる。