switchマッチング問題

4811 ワード

CとC++のswitchがcaseにマッチする問題は、次の2つの原則を覚えておけばいいです.
  • は、すべてのcaseが一致しない場合にのみdefault文
  • に入る.
  • 一致(caseでもdefaultでも)が見つかった場合、breakが見つかるまでswitchから飛び出しません.
  • 正常なswitchのdefault文をコードの最初に移行し、コードを実行すると問題が見つかります.
    #include <stdlib.h>
    #include <stdio.h>
    #include <iostream>
    #include <string>
    
    
    
    int main(int argc,char ** argv)
    {
        char str;
        //         ,             switch       
        if(argc==2)
            str=argv[1][0];
        switch (str)
        {
            default:
                    {
                    std::cout<<"default"<<std::endl;
                    break;
                    }
    
            case 'a':
                    {
                    std::cout<<"prefix a"<<std::endl;
                    break;
                    }
            case 'b':
                    {
                    std::cout<<"prefix b"<<std::endl;
                    break;
                    }
    
    
        }
    
        return 0;
    }
    

    上の最初の点、すなわちすべてのcaseが一致しない場合にのみdefaultに入ることを検証するために、defaultをswitch文の一番上に配置し、入力された最初の文字がaとb、cの場合を順次実行します.
    1つ目のケース(文字を入力しない、すなわちstrが空)と4つ目のケース(入力された先頭文字はcで、switchでは一致するcaseが見つからない)は一致するcaseが見つからないためdefault文に入り、2つ目のケースと3つ目のケースは一致するcaseが見つかり、defaultには入らなかった.このルールはdefaultがswitchの場所にあることとは関係ない.
    次に2番目のルールです.一致が見つかった場合、caseでもdefaultでもbreakジャンプに遭遇するまで下に実行されます.このルールはcaseに一致する場合に理解しやすいが、defaultに入る場合には直感的ではないか、上記のコードを例にdefault文のbreakを注釈し、同じテスト例を実行する.
    #include <stdlib.h>
    #include <stdio.h>
    #include <iostream>
    #include <string>
    
    
    
    int main(int argc,char ** argv)
    {
        char str;
        //         ,             switch       
        if(argc==2)
            str=argv[1][0];
        switch (str)
        {
            default:
                    {
                    std::cout<<"default"<<std::endl;
    // break;
                    }
    
            case 'a':
                    {
                    std::cout<<"prefix a"<<std::endl;
                    break;
                    }
            case 'b':
                    {
                    std::cout<<"prefix b"<<std::endl;
                    break;
                    }
    
    
        }
    
        return 0;
    }
    

    同じテストケースを実行した結果は次のとおりです.
    文字と入力文字c、すなわち一致するcaseが入力されずにdefaultに入った後、switchを直ちに終了するのではなく、break文に遭遇するまで下へ実行し続けたため、caseがaの場合、これが第2のルールであることがわかります.