(笔记—C++ Primer) 第五章 语句

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 prefer for to while 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成员函数, 提供关于异常的一些信息;

猜你喜欢

转载自blog.csdn.net/qq_35588560/article/details/80682810