链接:https://zhuanlan.zhihu.com/p/23669058
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
声明:
- 文中内容收集整理自《C++ Primer 中文版 (第5版)》,版权归原书所有。
- 原书有更加详细、精彩的释义,请大家购买正版书籍进行学习。
- 本文仅作学习交流使用,禁止任何形式的转载
- 简单语句
- 表达式语句
- 空语句
- 复合语句
- 语句作用域
- 条件语句
- if
- switch
- 迭代语句
- while
- for
- 范围for
- do while
- 跳转语句
- break
- continue
- goto
- return
- try语句和异常处理
- try语句
- throw表达式
- 异常类
表达式语句
表达式末尾加上分号就成了表达式语句
作用是执行表达式并丢弃掉求值结果
空语句
只含有一个单独的分号
如果我们多写了一个分号
int i = 0;;
实际是两句语句,后面一个分号是空语句
这种情况不会有什么影响,但是
while( i < 10 ) ;
++i;
空语句构成了while循环的循环体,导致死循环
复合语句(块)
用花括号括起来的语句和声明序列,也称为块
块不以分号结束
语句作用域
一个块就是一个作用域
if、switch、while、for内定义的变量都属于局部作用域
条件语句
MZF: 多加花括号会使事情变得简单很多
if
if语句可以嵌套
if(condition)
if(condition)
statement
else
if(condition)
statement
else if(condition)
statement
我们会通过缩进来给if...else进行配对,实际上,if的个数多余else的情况,称为悬垂else问题,else总是和离它最近的未匹配的if匹配
所以第一个else实际和内层的if匹配,整个语句开始变得复杂和难以理解
多加花括号会使事情变得简单
if(condition)
{
if(condition)
{
//do something
}
}
else
{
if(condition)
{
//do something
}
else if(condition)
{
//do something
}
}
花括号内的语句只有块作用域,所以对第一个else来说,内层的if是不可见的,它会和第一个if进行匹配,这也正是我们希望的
switch
case标签必须是整型常量表达式
一种简单明了的写法
switch( i )
{
case 0:
{
//do something
}
break;
case 1:
{
//do something
}
break;
case 2:
{
//do something
}
break;
default:
{
//do something
}
break;
}
如果某个case标签匹配成功,将从该标签开始往后顺序执行所有case分支,除非显式地中断这一过程
因此多加花括号和break,事件会变得简单
迭代语句
- while
- for
- 范围for
- do while
这些语句我们都不陌生了,再把书看看就行
for语句头能省略掉init-statement、condition和expression中的任何一个(或者全部)
do while语句是先执行循环体再检查条件,因此无论条件是否为真,循环体至少会执行一次
注意do while不是以花括号结束的,应当在后面加上分号
do
statement
while(condition);
跳转语句
- break负责终止离它最近的while、do while、for或switch语句
- continue终止当前这次迭代并立即开始下一次迭代
- 只有当switch嵌套在迭代语句内部时,才能在switch里使用continue
- 不要在程序中使用goto语句
try语句和异常处理
异常是指程序运行时的反常行为,这些行为超出了函数正常功能的范围,有的时候也超出了程序员的意料
通常情况下,异常会导致整个程序的终止
可以使用try语句块来处理异常。
try语句块以关键字try开始,并以一个或多个catch子句结束
try语句块中抛出的异常有机会被catch子句处理
我们程序员也可以主动的抛出异常,比如当检测程序中的数据库连接断开了,我们可以抛出异常来通知程序的其他部分进行处理
使用throw表达式抛出异常
要完成异常处理,除了try语句块和throw表达式外,我们还需要异常类,它负责携带异常的具体信息
标准库定义了一些异常类,不过多数情况下我们需要自定义自己的异常类