为什么我可以将一个案例放在switch语句中的另一个案例中?

时间:2017-12-31 20:00:05

标签: c++ switch-statement

以下是dbInterface.js语句的示例。我不明白为什么它会这样运作:

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之后没有break。但为什么我不会收到编译时错误呢?

  • 为了更清楚,为什么内部案例中的任何其他价值也会成功?如,

    case 100

3 个答案:

答案 0 :(得分:9)

  

但为什么我不会收到编译时错误?

因为你没有做任何违法的事。案例陈述只是一个带标签的陈述。评估开关中的表达式以确定要跳转到哪个标签(注意&#34;跳转&#34;和#34;标签&#34;)然后该语句开始执行。说实话,这只是伪装的转变。它有点受限制,但仍然是一个跳跃。

唯一的约束,因为这是C ++,你可能不会跳过对象的初始化跳过它。

此功能在Duff's Device中很常用(虽然在C中)。

  

更清楚的是,为什么内部案例中的任何其他价值也会成功?

因为跳跃后,这些标签并不重要。他们只标记具体的陈述。跳转后,执行正常进行。正常执行并不是因为它们被标记而避免使用特定的语句。

答案 1 :(得分:1)

为什么您没有看到任何编译错误?这是因为您正确使用了switch表达式。但是,您可能无法按需查看结果。 首先让我们尝试一个简单的switch表达式:

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-case块。 如果你不使用中断意味着下一个案例是目标。直到你不使用休息程序将继续。 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;    
}

答案 2 :(得分:0)

switch语句的作用类似于if语句,但在处理超过2或3个选项时,它更受欢迎。

switch评估case语句中的条件。因此,每当它找到一个案例时,它认为它是一个条件,所以它继续执行,直到发现一个中断作为语句结束的标志。在你的情况下,case 100开始,但另一个案例在里面,只要100你没有休息,它就会被执行。

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

如果仅case 100成功,将执行上述声明。

记住在C ++中你可以写:

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

int main(){

    b:
        foo();        

    return 0;
}

它与label类似,但仅限于关键字case。您可以说case内部案例没有switchbreak前面的情况与label的工作方式相同。