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的初始化)
时间: 2024-10-28 16:02:37