Hatena::Groupcoders

ラシウラ出張所 このページをアンテナに追加 RSSフィード

2007/03/24

[][] switch文とループとcaseベル  switch文とループとcaseラベル - ラシウラ出張所 を含むブックマーク はてなブックマーク -  switch文とループとcaseラベル - ラシウラ出張所  switch文とループとcaseラベル - ラシウラ出張所 のブックマークコメント

C言語やそれとの互換性を重視しているC++(やD言語も?)では、switchの直接の内側にforやwhileのループがかけます。

#include <stdio.h>

int main(int argc, char* argv[]) {
  int n = argc - 1;
  int i = 0;
  switch (n) {
    for (; i < 2; i++) {
      puts("a");
    case 0:
      puts("b");
    case 1:
      puts("c");
    case 2:
      puts("d");
    default:
      puts("e");
    }
    puts("f");
  }
  puts("g");
  return 0;
}

forの初期化式には絶対に到達しません。forの初期式やforとswitchの間に文があると、gccコンパイルすると到達しない旨の警告が出ます。

$ gcc -W -Wall switchfor.c
switchfor.c:3: 警告: unused parameter 'argv'

$ ./a.exe 1
c
d
e
a
b
c
d
e
f
g

switchは条件にあった場所にgotoしてるような感じですね。

この中でbreakを入れると、switch文を脱出することになります。

こういうフロー構造はJavaとかC#にはなくなったものですし、フローグラフで考えてもあまりいいものではないでしょう。