swtich语句
case关键字和它对应的值一起被称为case标签。case标签必须是整形常量表达式,另外要注意的是bool、char、short、枚举类型也算是整形。
switch语句中如果某个case标签匹配成功,将从该标签开始往后执行所有case分支。
每个case语句分支后都应该有break语句,以反之不必要的错误发生。如果是人为省略了break语句,则应该添加注释说明意图。另外每一个switch语句中都应该有default分支,哪怕其什么也不做。
swtich语句内部的变量定义
在switch语句中,如果在某处一个带有初值的变量位于作用域外,而在另一个case语句分支中该变量位于作用域之内,则从前一处跳转到后一处的行为是非法的。c++规定,不允许跨过变量的初始化语句直接跳到该变量作用域的另一个位置。
case true:
string file_name; //错误:控制流绕过了一个隐式初始化的变量
int val = 0; //错误:控制流绕过了一个显式初始化的变量
int val; //正确:因为val没有进行初始化
break;
case false:
val = next_num();
if(file_name.empty())
{
...
}
break;
一般来说,如果需要为某个case分支语句定义并初始化一个变量,我们应该将变量定义在一个语句块中,从而保证后面的case标签都在变量作用域外。
case true
{
string file_name;
}
break;
goto语句
goto语句的作用是从goto语句无条件跳转到同一函数内的另一条语句。语法形式如下:
goto label; //label为一个语句标签
label是用于标识一条语句的标识符。带标签语句是一种特殊的语句,在它之前有一个标识符以及一个冒号:
end: return; //一条带标签语句
和switch语句类型,goto语句也不能将程序的控制权从变量的作用域之外转移到作用域之内,比如
goto end;
int ix = 10;
end:
ix = 42; //错误,跳过了变量的初始化语句
向后跳过一个已经执行的定义时合法的,跳到变量定义之前意味着系统将销毁该变量,然后重新创建它。
begin:
int sz = get_size();
if(sz < 0)
{
goto begin; //从作用域内跳到作用域外是合法的
}
在实际编程中应该尽量少使用goto语句,因为这使程序难理解而且不宜修改。