天天看点

关于C/C++中switch语句case中变量不能初始化赋值的问题

  C++新手一枚,近几日编写代码时,有如下错误,是关于C/C++中switch语句case中变量不能初始化赋值的问题。代码如下:

<pre name="code" class="cpp">#include <iostream>
using namespace std;
int main()
{
   char op;
   cin>>op;
   switch(op)
   {
    case '0':
     int a=3;
     break;
    default:
     break;
   }
   return 0;
}
           
<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">编译器会提示如下错误</span>
           

 error C2361:"default"标签跳过'op'd的初始化操作

可是如果将第10行代码int a=3;改为int a;  a=3;

编译器就不再提示错误。

这是为了防止下面这种错误

<pre code_snippet_id="495309" snippet_file_name="blog_20141024_1_2605774" class="cpp" name="code"><pre name="code" class="cpp">#include <iostream>
#include <iomainp>
using namespace std;
int main()
{
   int op;
   cin>>op;
   switch(op)
   {
      case '1':
          int a;
          break;
      case '2':
          a=2;
          break;
      default:
          break;
   }
    return 0;
}
           

在 上述代码中如果在case‘0’中进行了变量a的声明,而在case'2'中进行了使用,这会发生作用域错误。

而c++规定不能跳过变量初始化语句直接跳到变量的作用域内

这个错误属于语法问题,应加以记忆。解决方案有两种

1.case中如有变量初始化,一定要加{}

为什么?

加上{}就是新的作用域了,C89,ANSI C只能在新的作用域开始处定义变量

2.可把初始化放在switch之前

注意:int类型和用户自定义类型,实质都是一样的。都属于数据类型,只不过一个是简单数据类型,一个是复合数据类型

继续阅读