switch文に指定する文は、ブロックでなくてもよい。
int main() { // OK switch(0) ; // OK switch(0) default : std::cout << "hello" << std::endl ; }
もちろん、ラベル文がたったのひとつしか書けないので、実用上の意味はない。ブロックでなくてもいいとは知らなかった。てっきり、ブロックを指定するものだと思っていた。知らなかった。まあ、知っていても、全く役に立たない知識ではある。
追記:コメントを素直に実装するとこうなる
void f( int const value ) { int i = 0 ; switch( value ) for ( ; i != 10 ; ++i ) { case 1 : case 2 : std::cout << "value is 1 or 2" << std::endl ; continue ; default : break ; } }
このコードは完璧にwell-formedなコードなので、当然だが、MSVCでもGCCでもコンパイルが通り、しかも意図通りに動作する。恐ろしい。そもそも、ループ文の外から、ループの内側のラベルに飛ぶというのは、邪悪すぎる。
Duff's Deviceで用いられてるように、switch内に条件文やループを書いて、その中にcaseを書くことができると思います。
ReplyDelete使いたくないですけど。
ああ2chで前に見た事があるような話題ですね。
ReplyDeleteswitch文と他の文は完全に独立して解析されるので、気持ち悪い文が書けるわけです。