首页 > 技术文章 > C++中switch 语句中的变量声明和

uangyy 2016-04-24 01:39 原文

switch 内部的变量定义:

 1 int i = 1;
 2 switch(i)
 3 {
 4     case 0:
 5         string str;            //error
 6         int val1 = 0;        //error
 7         int val2;              //right
 8         int val3; val3 = 0; //right
 9     case 1:
10         val2 = 9;
11         cout << val2 << endl;
12 }

《C++ Primer》 P163: 如果在某处一个带有初始值的变量位于作用域之外,在另一处该变量位于作用域之内,则从前一处跳转到后一处的行为是非法行为。

在上面的代码中line 5、6是错误的,line 7、8是没问题的。

首先要明确的是,对于line 5、6、7、8中的变量来说,整个switch语句的{}内的声明之后的范围都是可见的。case语句不构成独立的作用域,即在case 0:下定义的val2,在case 1下也是可见的(红色字体貌似有问题)。

但是line5、6是错误的,因为在5、6两行都在声明变量时对变量进行了初始化(line 5 调用了默认的初始化函数),如果跳过此代码,则可能会产生不可意料的错误,编译器会报错。line 7、8是正确的,因为在声明的时候并没有对变量初始化。

(如果有初始化,那么后面的代码可以直接使用,但是如果跳过了初始化编译器就会认为会发生不可预料的错误进而报错。如果没有初始化,则编译器不会因为跳过此语句而报错,因为你本来就没有初始化并且这是c/c++允许的,比如在函数中的int a;就是一个未初始化的变量)

所以,不可以跳过带初始值的变量(同一个作用域之内)。 在goto语句中同理:

1 int i = 1;
2 goto case_1;
3 
4 case_0:
5     int val1;        //right
6     int val2 = 9; //error
7 case_1:
8     val1 = 9;
9     val2 = 10;

 

test_scope.cpp: In function ‘int main(int, char**)’:
test_scope.cpp:7: error: jump to label ‘case_1’
test_scope.cpp:2: error:   from here
test_scope.cpp:6: error:   crosses initialization of ‘int val2’ (跳过了val2的初始化)

 

推荐阅读