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:

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

    使いたくないですけど。

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

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

    ReplyDelete

You can use some HTML elements, such as <b>, <i>, <a>, also, some characters need to be entity referenced such as <, > and & Your comment may need to be confirmed by blog author. Your comment will be published under GFDL 1.3 or later license with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.