码迷,mamicode.com
首页 > 编程语言 > 详细

C++中switch 语句中的变量声明和

时间:2016-04-24 06:20:22      阅读:239      评论:0      收藏:0      [点我收藏+]

标签:

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是正确的,因为在声明的时候并没有对变量初始化。

所以,不可以跳过带初始值的变量(同一个作用域之内)。 在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的初始化)

 

C++中switch 语句中的变量声明和

标签:

原文地址:http://www.cnblogs.com/uangyy/p/5426224.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!