2010-07-13

今まで知らなかったswitch文の仕様

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でもコンパイルが通り、しかも意図通りに動作する。恐ろしい。そもそも、ループ文の外から、ループの内側のラベルに飛ぶというのは、邪悪すぎる。

2 comments:

qnighy said...

Duff's Deviceで用いられてるように、switch内に条件文やループを書いて、その中にcaseを書くことができると思います。

使いたくないですけど。

萌ゑ said...

ああ2chで前に見た事があるような話題ですね。

switch文と他の文は完全に独立して解析されるので、気持ち悪い文が書けるわけです。