Switch语句case中变量不能初始化赋值的问题

关于C/C++中switch语句case中变量不能初始化赋值的问题
这里我写了一个测试

比如:

#include <iostream>
using namespace std;
int main()
{
    int op;
    cin >> op;
    switch (op)
    {
    case 1:
        int a = 1; 
        break;
    case 2:
       a = 2;
        break;
    case 3:
        a = 3;
        break;
    default:
        break;
    }
    return 0;
}

这会报错!编译器会提示如下错误error C2361: “default”标签跳过“a”的初始化操作


将代码int a=1;改为int a;  a=1;编译器就不再提示错误。
如下:

#include <iostream>
using namespace std;
int main()
{
   int op;
   cin>>op;
   switch(op)
   {
    case 1:
     int a;
    a=1;
     break; 
  case 2:
       a = 2;
        break;
    case 3:
        a = 3;
        break;
    default:
     break;
   }
   return 0;
}


 

也可将代码改成如下,编译器不提示错误。

#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;   
     case 3:

        a = 3;

        break;

      default:

          break;

   }

    return 0;
}

在 上述会报错的原代码中如果在case‘0’中进行了变量a的声明,且同时初始化了( int a = 1; ),而当其他dcase:中进行了使用(赋值)时,这会发生作用域错误。

 错误原因:

switch里面的语句属于同一作用域范围,即case 1里面只声明(int a)的变量在switch任何范围都是可以使用的,理论上case 2也可以使用case 1的未初始化变量。

但是如果变量a的声明的同时初始化了在case 1里面,但是op直接等于2、3、4.....的话,就没有运行case 1的语句,这样的话就会导致变量还没有定义,所以会报错误!

而!!!
C++规定:不允许跨过变量的初始化语句直接跳转到该变量作用域内的另一个位置。这就要求我们在case语句中不能对变量进行初始化操作(可以进行声明定义,声明定义是在编译时期发生的,所以无论如何都无法跳过,但是初始化是可以跳过的,但是这种操作是不被允许的)。
解决:

如果我们想要在case语句中定义并初始化一个变量,

则解决方案有两种

1.case中如有变量初始化,一定要加 {}   ,变量定义在块内,从而确保后面所有的case标签都在变量的作用域之外

为什么?

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

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

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

3.将需要的部分写成一个函数 (本质还是方法一)

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值