C++ switch case结构中定义变量问题

看C++ primer 5th p176上说,switch结构只能在最后一个case或default标号后面定义变量。

但经我在gcc下测试,给定义int j=2时,确实会报错,但只定义int j,未给j指定初始化值时不会报错,为什么?


switch(5){
    case 1:
        //int j=2;  //error: jump to case label [-fpermissive]  
        int j; //不报错
        break;
    case 2:
        cout<<"2"<<endl;
        break;
    default:
        cout<<j<<"default"<<endl;
        break;
}
阅读 5.6k
2 个回答

参照 https://www.zhihu.com/questio...

因为初始化的时候对分配的这块栈空间进行了赋值,如果这条语句被跳过后,编译器无法对栈空间进行还原处理。

只定义未初始化的话,定义的变量在全局都有效,只是一段未初始化的栈空间,无影响。

你看了书上的例子吗?

case true:
    // this switch statement is illegal because these initializations might be bypassed
    string file_name; // error: control bypasses an implicitly initialized variable
    int ival = 0;     // error: control bypasses an explicitly initialized variable
    int jval;         // ok: because jval is not initialized
    break;
case false:
    // ok: jval is in scope but is uninitialized
    jval = next_num(); // ok: assign a value to jval
    if (file_name.empty()) // file_name is in scope but wasn't initialized
        // ...

注意, 其中int jval; // ok: because jval is not initialized..

switch语句实际上是在一个作用域内, 并没有嵌套作用域, 但是如果跳过了一个变量的定义的话, 如果下下一处直接使用了这个变量的话, 变量就没有定义,所以 C++ 不允许.

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题