switch case被人忽视的一点!zt

这个分支语句怎么的用相信很多人晓得,如果碰到一个错误咋办?

先看看程序:

switch (t)
{
  case 0:
  int a = 0;
  break;

  case 1:
  default:
  break;
}

明显报错,initialization of 'a' is skipped by ' case' label

 有两种解决方法。

其实这一起都是由于变量的作用域作祟,switch里面的a定义了,那么他就应该在以后直到default后的“}”出现,如果t不等于0,那么程 序执行到case0后面去了,但是a的作用域一直存在,而且还一直就不让后面的“同志使用”,给看不准用,这样是不对的。这个过程发生在编译时刻识别。

要么让作用域按照自己的想法执行,要么就把变量的识别转移到运行时刻!

一:

作用域缩小,把有定义新的变量且同时初始化的,放到一个花括号里面去,那么随着过程的结束,变量消失,而且也不会被后面的看到。

这样:

 switch (a) {
  case 1: {
   int ab = 11;
   cout << ab << endl;
    }
  case 2: {
   cout << a << endl;
    }
 }

第二:

运行时刻识别,一个没有初始化的变量,具体值要到运行时刻才被确定,这样就可以被后文使用。我们只是声明,啥时候用的时候啥时候再给出值。

switch (a)
{
case 0:
    int t;
    t= 0;
    break;
default:
    break;
}

这样就没有问题了,其实这一招对类对象也是可以用的。比如:

一个类,我们不给出显示初始化构造函数,那么他的值也是未定义的,具体的给值也要到运行时刻。

class B
{
 int pp;
};

switch (a)
{
case 0:
B b;
break;
default:
break;
}

但是一旦定义了默认构造函数,即便是一个空的函数,也是不行的,因为这样就导致了对象的创建而且初始化。

如下就是不对的:

class B
{
 int pp;
public:
 B() {}
};

switch (a)
{
case 0:
B b;
break;
default:
break;
}

 return 0;
}

编译一下就可以看到如下错误:

d:\csdnc++\1215\switchcase\switchcase\switchcase.cpp(42) :

error C2361: initialization of 'b' is skipped by 'default' label
loop's blog
原文地址:https://www.cnblogs.com/goodloop/p/1374459.html