(笔记—C++ Primer) 第五章 语句
程序员文章站
2024-03-11 11:54:07
...
1. 简单语句
- 表达式语句: 表达式加分号
- 空语句:只含有一个分号,当语法上需要一个语句,但逻辑上不需要时使用;
- 使用空语句时应该加注释,表明语句是可以省略的;
- 多余的空语句可能会造成危害:如在
while(true);cout<<i;
则cout<<i;
不再处于循环体中;
- 复合语句(块):用花括号
{}
包含多条语句和声明的序列; 块限定了变量的作用域;- 在程序中,语法上只需要一条语句,逻辑上需要多条语句,此时用块;
2. 语句作用域
- 可以在
if, switch, for , while
等控制结构中定义变量,但定义的变量只能在相应的语句内部可见;
#include <iostream>
int main()
{
while (int i = get_num())
cout << i <<endl;
i = 0; //wrong! 无法访问i
return 0;
}
3. 条件语句
3.1 if语句
if(conditionn)
statement1
else
statement2
- 注意使用花括号,避免语句被无条件执行
-
悬垂else: 当存在多个
if...else...
嵌套时,if
分支可能会多于else
分支;在C++中,规定else
与最近的一个未匹配的if
匹配; - 为获得想要的匹配方式,使用花括号控制执行路径;
3.2 switch语句
switch(option)
{
case 1 : break;
case 2 : break;
default:
}
-
option
表达式 将会转换成整数类型与case
标签比较 -
case
标签必须是整型常量,而且不得含有两个相同的标签; - 如果某个
case
匹配成功,将顺序执行后面的左右case
分支,因此,break
的添加时有必要的; - 如果要在一个
case
分支定义并初始化一个变量,则不可以再另一分支中使用该变量; - 当多个匹配标签执行相同语句时:
case 1: case2: case 3:
statement;
break;
4. 迭代语句
4.1 while语句
while(condition)
statement;
- condition 不能为空,可以是表达式或者带初始化的变量声明;
- 条件或循环体中的变量每次迭代都经历创建到销毁;
4.2 for语句
for(init_statement ; condition; expression)
statement;
- 执行过程: init —> condtion —> statement —> expression —>condition …
- init可以定义多个变量,但是只能有一个声明,即类型必须一致;
- condition缺省是,永远为
true
4.3 范围for语句
for(declaration: expression)
statement;
- 可以方便地遍历容器和其他序列的元素
- expression必须是序列,拥有能够返回迭代器的成员
begin
,end
; - declaration为保证类型相容: 采用
auto
4.4 do while语句
do
statement;
while(condition);
- 先执行循环体再检查条件;因此条件中不可以定义变量;
- 条件后要加分号表示结束;
- 循环体中定义的变量不可以作为用在条件中, 已经在作用域外;
for 语句相对while的优势:
I preferfor
towhile
in such cases, because it’s terse. More importantly, object i won’t pollute the external scope after it goes out of the loop. It’s a little bit easier to add new code into the external scope, since it reduces the possibility of naming conflicts .That is, a higher maintainability. Of course, this way makes the code a bit harder to read
5. 跳转语句
- 共有四种跳转语句,
break, continue, goto, return
;
5.1 break语句
-
break
负责中止最近的迭代语句或switch
语句,并从其后继续执行;即跳出循环或switch
; -
break
只能在循环语句或switch
内部;
5.2 continue语句
-
continue
仅用于循环体中,中止当前循环内容,进入下一次迭代; - 仅用于最近的循环语句;
5.3 goto语句
- 不要再程序中使用goto语句,使得程序既难修改,又难理解;
goto label;
6. try 语句块和异常处理
6.1 throw 异常检测
throw runtime_error("XXXX");
- 抛出(raise)异常将中止当前函数,并将控制权转移给异常处理代码;
6.2 try … catch
try
{
program-statements
throw exception-type(" XXX ");
}catch(exception-type err)
{
handle-statements
}catch(exception-declaration)
{
handle-statements
}
- 运行一段
program-statements
,抛出一个异常,当与catch
的异常声明匹配时,执行相应块; - 若一段程序没有try语句块,且发生了异常,则系统调用了terminate函数并终止当前程序执行;
-
catch
处理完异常之后,继续按顺序执行后面的代码;
6.3标准库异常类
-
exception, bad_alloc, bad_cast
采用默认初始化 - 其他异常类型需要用字符串进行初始化;
- 异常类型只有
what
成员函数, 提供关于异常的一些信息;
上一篇: PHP实现的简单适配器模式示例
下一篇: async/await的基础用法