switchマッチング問題
4811 ワード
CとC++のswitchがcaseにマッチする問題は、次の2つの原則を覚えておけばいいです.は、すべてのcaseが一致しない場合にのみdefault文 に入る.一致(caseでもdefaultでも)が見つかった場合、breakが見つかるまでswitchから飛び出しません. 正常なswitchのdefault文をコードの最初に移行し、コードを実行すると問題が見つかります.
上の最初の点、すなわちすべての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を注釈し、同じテスト例を実行する.
同じテストケースを実行した結果は次のとおりです.
文字と入力文字c、すなわち一致するcaseが入力されずにdefaultに入った後、switchを直ちに終了するのではなく、break文に遭遇するまで下へ実行し続けたため、caseがaの場合、これが第2のルールであることがわかります.
#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のルールであることがわかります.