语句
一.简单语句
1.表达式语句
对一个表达式的末尾加上一个分号,就变成了表达式语句
2.空语句
而空语句则只含有一个分号:
while(1)
{
;
}
3.复合语句(块)
复合语句是用花括号括起来的,复合语句也被称作块
,块
不以分号结束,而空块等价于空语句
二.语句作用域
可以在if
、switch
、while
、for
等语句的控制结构内定义变量,而这些变量只能在相应的语句内部看见,一旦语句结束,变量就超过其作用范围了。后面会详细介绍
三.条件语句
1.if语句
这个很常用,就不过多介绍,不过if的else
有个特性,就是else会与离它最近的尚未匹配的if进行匹配
就像这样:
if (a > 10)
if (a > 50)
cout << "a > 50";
else
cout << "a < 10";
实际上,当a输如在10~50的时候会输出a < 10
,而并不想我们想的对齐那样。这一点和python
有巨大我的差距!!!
当然,要实现这种功能,我们可以添加花括号:
if (a > 10)
{
if (a > 50)
cout << "a > 50";
}
else
cout << "a < 10";
2.switch语句
对于switch
语句的基本形式如下:
switch(表达式)
{
case 值1: 表达式; break;
case 值2: 表达式; break;
......
case 值n: 表达式; break;
default: 表达式; break;
}
其中,break
和default
可以不要。
如果值等于表达式的结果,那么就会一直从这个值所在的地方开始,一直运行到switch
的尾部或者遇到break
跳出switch
而default
标签里可以放一个空语句,即使你什么也不准备做,但这样写会是逻辑更清晰
四.迭代语句
1.while语句
while
语句的结构如下所示:
while(condition)
statement
对于条件部分,我们一定要写个可以设法改变的值,否则这就是一个死循环。
而且:定义在条件或者语句内的变量,在每一次迭代的时候,都会经历从创建到销毁的过程
2.for语句
基本结构
for (init-statemaen; condition; expression)
statement
其中这四个部分,你可以省略一个到多个,甚至全部。而init-statement
里,只能有一条语句申明,所以如果要申明多个变量的话,需要所有的基础类型相同。
3.范围for语句
这个前面了解过,可以遍历容器或者其他序列里的所有元素:
for (declaration : expression)
statement
4. do while语句
do-while
语句和普通的while
差不多,只是说它是先执行一次循环体,再进行判断,且最后的条件语句后面要加;
do
statement
while (condition);
五.跳转语句
1.break
break
是终止离它最近的循环或者switch
2.continue语句
continue
语句是终止最近的循环中的当前迭代,并开始下一次的迭代,该语句只能出现在for while do-while
循环语句的内部,作用范围也是最近的一个循环。
3.goto语句
goto
的语法是:
goto lable;
而goto
的目标是标签,标签的表示方法是lable: statement
比如,我们来写一个永远输出2
的死循环:
end: int x = 1;
cout << ++x;
goto end;
六.try语句块和异常处理
没有代码会是“完美”的,多多少少在各种情况下可能会出现bug,这个时候就需要我们使用异常处理,来处理这些奇怪的异常。在C++中异常处理包括以下:
- throw表达式:检测部分使用它,如果在它的范围内遇到了无法处理的问题,就说
throw
引发了异常。 - try语块:try语块从关键字
try
开始,并以一个或多个catch
结束。因为catch
“处理”异常,所以他们也被称作异常处理代码
- 一套
异常类
,用在throw
和catch
里传递异常的信息
1.throw表达式
比如:
if (check() == false)
throw runtime_error("error");
其中runtime_error
是标准库类型的一种,我们必须用一个字符串去初始化它,一般用于存放一些异常的辅助信息。
2.try语句块
语法形式:
try{
program-statements
}catch (exception-declaration){
handler-statements
}catch (exception-declaration){
handler-statements
}
//.......
也就是说,如果program-statements
出现了问题,抛出了异常,并且在catch
中有对该异常的声明,那么就会跳转到该catch
的haldler-statements
里,如果没有抛出异常,则会到最后一个catch
子句后面的那条语句继续执行(也就是try的花括号后面)。
注意:try语块里面申明的标量在它的外部是没法访问的,包括catch
里
如果抛出异常后,没有在它里面找到catch
语句,就会返回调用这个含有try
的函数的函数里去寻找try
,就一层一层往上找,如果到了最后都没有找到,那么就会转到一个叫做terminate
的标准库函数里。
3.标准异常
①exception定义的异常类
定义了最通用的异常类exception
,它只报告异常的发生,不提供任何额外信息。
异常名称 | 说明 |
---|---|
exception | 最常见的问题 |
bad_exception | 这是个特殊的异常,如果函数的异常列表里声明了 bad_exception 异常,当函数内部抛出了异常列表中没有的异常时,如果调用的 unexpected() 函数中抛出了异常,不论什么类型,都会被替换为 bad_exception 类型。 |
②stdexcept定义的异常类
定义了几种常用的异常类。
异常名称 | 说明 |
---|---|
runtime_error | 只有在运行时才能检测出的问题 |
range_error | 运行时出错:生成的结果超出了有意义的值域范围 |
overflow_error | 运行时出错:计算上溢 |
underflow_error | 运行时出错:计算下溢 |
logic_error | 程序逻辑错误 |
damain_error | 逻辑错误:参数对应的结果值不存在 |
invalid_argument | 逻辑错误:无效参数 |
length_error | 逻辑错误:试图创建一个超出该类型最大长度的对象 |
out_of_range | 逻辑错误:使用一个超出有效范围的值 |
③new定义的异常类
异常名称 | 说明 |
---|---|
bad_alloc | 使用 new 或 new[ ] 分配内存失败时抛出的异常。 |
④type_info定义的异常类
异常名称 | 说明 |
---|---|
bad_typeid | 使用 typeid 操作一个 NULL 指针,而且该指针是带有虚函数的类,这时抛出 bad_typeid 异常。 |
bad_cast | 使用 dynamic_cast 转换失败时抛出的异常。 |