switch 内部的变量定义
1.因为C++语言规定,不允许跨过变量的初始化语句直接跳转到该变量作用域内的另一位置,所以有了如下情况:
bool bsuccess = false; switch (bsuccess) { case true: std::string str; // 错误,定义了一个隐式初始化的变量 int i = 0; // 错误,定义了一个显示初始化的变量 int j; // 正确,因为j没有初始化 { std::string str1; // 正确,声明语句位于语句块内部 } break; case false: j = 1; // 正确,给j赋值 if (str.empty()) // 错误,str在作用域内,但是没有初始化 { } if (str1.empty()) // 错误,str1不在作用域内 { } break; default: break; }
2. switch语句里不能够使用 continue 语句,除非它内嵌在其他的迭代语句之中。
goto 语句
1.和switch语句类似,goto语句也不能将程序的控制权从变量的作用域之外转移到作用域之内。
goto end; int i = 0; // 错误,goto语句绕过了一个带初始化的变量定义 end: i = 1; // 错误,此处使用i,但是goto语句绕过了它的声明
但是以上语句可以在VS2015编译通过
2.向后跳过一个带初始化的变量定义是合法的,跳回到变量定义之前意味着系统将销毁该变量,然后重新创建它。
begin: int i = 10; // ... if (i <= 0) goto begin;