2017-12-31 265 views
9

switchステートメントの例を次に示します。版画上記のプログラムswitch文で別のケースの中にケースを置くことができるのはなぜですか?

int main(){ 

    int number1 = 100, number2 = 200; 

    switch(number1){ 
     case 100:{ 
      cout << " outer switch number is: " << number1 << endl; 
     case 200:{ // any value other than 100 
       cout << "inner switch number is: " << number2 << endl; 
      } 
      break;    
     } 
     break;  
    } 

    return 0; 
} 
  • を:私はそれがこのように動作する理由得ることはありません100、その後case 200の次のステートメントを出力します。また、200以外の値が2番目のケースで使用されても、まだ実行されます。私はcase 100の後にはbreakがないことを知っています。しかし、なぜ私はコンパイル時エラーを受け取らないのですか?

  • 明確にするために、なぜインナーケース内の他の値も成功しますか?例えば、

    case 70000: 
    
+1

スイッチ/ケースは、値を計算したgoto/labelとかなりの差があり、いくつかの追加の制約があります。 – Eljay

+2

'case 100'と' case 200'の間に 'break'文がないので、fall throughが起こります。 –

+2

['switch'は誰よりももっと厄介なことがあります](http://blog.robertelder.org/switch-statements-statement-expressions/) –

答えて

9

しかし、なぜ私が代わりにコンパイル時エラーを取得しませんか?

あなたは違法な行為をしなかったので、 caseステートメントは、単なるラベルステートメントです。スイッチ内の式は、ジャンプするラベルを特定するために評価され(ジャンプとラベルに注意してください)、そのステートメントは実行を開始します。正直言って、それは偽装のただのゴートです。もう少し拘束されていますが、まだまだジャンプです。

これはC++なので、唯一の制約は、オブジェクトの初期化を先に飛ばしてスキップできないことです。

この機能は、Duff's Device(ただしCでも)で有名でした。

もっと明確にするために、なぜインナーケース内の他の値も成功するのでしょうか?

ジャンプが実行された後、これらのラベルは問題にならないためです。彼らは特定のステートメントをマークするだけです。ジャンプ後、実行は正常に進みます。通常の実行では、ラベルが付けられているため、特定のステートメントを避けることはできません。

+0

ありがとうございます。しかし、 'case 0'や' case 100000'と書くと、どんな値でも動作します。 – Alex24

+2

@ Alex24 - いいえ、そうではありません。 '100'では、外側ブロックの実行を開始します。 '200'では、外側ブロックの最初の命令をスキップし、内側ブロックにジャンプします。 '200'を' 10000 'に変更すると、 'number1'が' 100'であるので外側ブロックの実行を開始します。 – StoryTeller

+0

私は、外側が成功すれば、評価される内側の値が成功するかどうかを知りますか? – Alex24

1

なぜコンパイルエラーが表示されないのですか?これは、switch式を正しく使用したためです。しかし、あなたは望む結果を見ることができないかもしれません。あなたが他の番号を使用する場合は、switch-caseブロックに追加することができます

switch(number1){ 
    case 100: 
     cout<<"the number is 100"<<endl; 
     break; 
    case 200: 
     cout<<"the number is 200"<<endl; 
     break; 
    default: 
     cout<<"the number is neither 100 nor 200"<<endl; 
     break; 
} 

: まず、簡単なswitch式を試してみましょう。 ブレークを使用しない場合は、次のケースがターゲットであることを意味します。ブレークを使用しない限り、プログラムは続行されます。 defaultは、上記のことが起こらない場合、私はこの部分をしたいと言います。

のは、あなたのプログラムに行き、何が起こっているかしてみましょう:

switch(number1){ 
    case 100:{//if the number is 100 it will start from here 
     cout << " outer switch number is: " << number1 << endl; 
     //it will break after the first break expresion 
    case 200:{ // any value other than 100// if the number is 200 it will start from here 
      cout << "inner switch number is: " << number2 << endl; 
     } 
     break; // I meant her is the first break  
    } 
    break;  
} 
0

switch文はif文のように動作しますが、2つの以上または3の選択肢を扱うときには、それに好適です。

switchcaseステートメントの条件を評価します。だから、それが条件とみなされるケースを見つけるたびに、ステートメントの終わりの兆候として見つかったブレークまで、実行を継続します。あなたのケースではcase 100が始まりますが、100人のための休憩がない限り、別のケースが内部にあるので、それ以降のすべてが実行されます。

case 100: 
    // do some stuff 
    case 0: 
     // do another stuff 
    case 5779: 
     // do .... 
break; 

アル上記の文は、ifのみとcase 100が成功した場合に実行されます。

は、あなたが書くことができ、C++で覚えておいてください:

void foo(){ 
    cout << "foo" << endl: 
} 

int main(){ 

    b: 
     foo();   

    return 0; 
} 

それはそのlabelようにだけキーワードcaseと。 がないか、breakが先行するcaseは、labelの場合と同じように動作します。

関連する問題