c++ primer 读书笔记第五章:语句

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是用于标识一条语句的标识符。带标签语句是一种特殊的语句,在它之前有一个标识符以及一个冒号:

endreturn;        //一条带标签语句

和switch语句类型,goto语句也不能将程序的控制权从变量的作用域之外转移到作用域之内,比如

    goto end;
    int ix = 10;
end: 
    ix = 42;           //错误,跳过了变量的初始化语句

向后跳过一个已经执行的定义时合法的,跳到变量定义之前意味着系统将销毁该变量,然后重新创建它。

begin:
    int sz = get_size();
    if(sz < 0)
    {
        goto begin;     //从作用域内跳到作用域外是合法的
    }

在实际编程中应该尽量少使用goto语句,因为这使程序难理解而且不宜修改。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值