2

if ブロック内のコードが何らかの方法で実行されたのはなぜですか?

switch(v)
{
case a:
    break;
...
if(condition)
{
    case f:
        ...
        break;
    case g:
        ...
        break;
}
...
case z:
    ...
    break;
default:
}
4

6 に答える 6

9

C ++コンパイラは、ルックアップテーブルを使用するか、caseステートメントへの直接分岐を使用します。-ステートメントを無視しますif。そのため、breakからも到達していませんcase a

長い答えはcase、この方法を使用してステートメントを「オフにする」ことはできません。

代わりに、次のようなものが必要になります。

switch(v) {
  case a :
    break;
  //...
  case f :
    if(condition) {
      //...
    }
    break;
  case g :
    if(condition) {
      //...
    }
    break
  //...
  case z :
    break;
}
于 2013-01-14T15:30:37.930 に答える
2

名前が示すように、ラベルは実際のcase ラベルであり、ラベルと非常によく似た働きをしgotoます: 実行スレッドはラベルにジャンプするだけです。switchその構造が別のネストされたステートメントでない限り、それがどの構造にあるかは問題ではありません。

これは次と同じように機能します。

if (v == f)
    goto f_label;

if (condition) {
    f_label:
    // ...
}

実行スレッドは、truef_label:かどうかに関係なく、ラベルにジャンプします。ラベルも同じように機能します。conditionswitch

于 2013-01-14T15:37:35.070 に答える
1

スイッチのcase句は非常に柔軟でありhacks、それらに対していくつか行うことができます。たとえば、一部の人々がスイッチを使用してネストされたforループから抜け出すのを見てきました。上記の例でも、vがそうである場合、fまたはgスイッチはifステートメントをスキップし、ケースのコードはスイッチの直後に実行されます。

于 2013-01-14T15:28:57.793 に答える
1

プログラムのコンパイル時に、あるテーブルから別のswitchテーブルにジャンプするテーブルが作成さcaseれます。これは、他の条件付き操作を無視してジャンプします。このような動作によるところで、長いブロックswitchよりも高速です。if-else

于 2013-01-14T15:32:58.030 に答える
1

方法に対する最良の答えは次のとおりだと思います(Nikos C.の答えに触発されました):

switch(v)
{
case a:
    break;

case z:
    ...
    break;
default:
    if(condition)
    {
        switch(v)
        {
        case f:
            ...
            break;
        case g:
            ...
            break;

        default:
            //former default
        }

    }
    else
        //former default
}
于 2013-01-14T16:12:42.447 に答える
0

Switch は、その間のすべてのステートメントを無視して、一致したケースにジャンプします。意図したことを達成するには、次の 2 つの方法があります (実装する必要があるケースの数によって異なります)。

if 条件の下でより多くのケースの方法 1

  if(condition) {
  switch(v) {
  case f :
    ....
    break;
  //...
  case g :
    ....
    break;
  //...
  case z :
    break;
}


  switch(v) {
  case a :
    ....
    break;
  //...
}

if 条件の下でより少ないケースの方法 2

    switch(v) {
  case a :
    break;
  //...
  case f :
    if(condition) {
      //...
    }
    break;
  case g :
    if(condition) {
      //...
    }
    break
  //...
  case z :
    break;
}
于 2013-01-14T15:40:35.260 に答える