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

Ale*_*x24 9 c++ switch-statement

这是一个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;
}
Run Code Online (Sandbox Code Playgroud)
  • 上面的程序打印:100然后打印下一个语句case 200.此外,如果200在第二种情况下使用的值以外的任何值,它仍然会被执行.我知道break之后没有了case 100.但是为什么我不会得到编译时错误呢?

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

    case 70000:
    
    Run Code Online (Sandbox Code Playgroud)

Sto*_*ica 9

但是为什么我不会得到编译时错误呢?

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

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

这个功能在Duff的设备中很常用(尽管在C中).

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

因为在执行跳转之后,这些标签无关紧要.他们只标记具体的陈述.跳转后,执行正常进行.正常执行不会因为标记而避免使用特定语句.

  • @ Alex24 - 不,不.对于'100`,它将开始执行外部块.对于`200`,它将跳过外部块中的第一条指令,并跳转到内部块.如果将"200"更改为"10000",它仍然会开始执行外部块,因为"number1"是"100". (2认同)
  • @ Alex24 - 什么都没发生.除了允许`switch`直接跳转到标签外,标签不会以任何方式改变语句.跳转之后,这只是一个普通的陈述. (2认同)