我读C++ Primer - 语句

本章讲解C++ 语言的语句,主要有条件执行语句,重复执行相同代码的循环语句和用于中断当前控制流的跳转语句。

通常情况下,语句是顺序执行的。所以C++ 提供了一组控制流语句以支持更复杂的执行路径。


1  简单语句

一个表达式,末尾加上分号,就是一个表达式语句。其作用是执行表达式并丢弃求值结果。

空语句:只含有一个单独的分号。用于语法上需要一条语句但是逻辑上不需要,如一个while 循环的全部工作在条件部分就可以完成时。使用空语句应该添加注释,让人知道该语句是有意省略。

复合语句;花括号括起来的语句和声明的序列,也称块。在块中引入的名字只能在块内部及嵌套在块中的子块里访问。


2  条件语句

C++ 有两种按条件执行的语句。一是if 语句,一是switch 语句。

if 语句经常会嵌套使用,有时无法一眼看出if 与 else 的匹配关系,最好用花括号括起来,控制执行路径。if 常用,就不举例。

switch 语句提供了一种便利的途径使我们能在若干固定选项中做出选择。如统计字符出现次数:

unsigned aCnt = 0, bCnt = 0;
char ch;
while (cin >> ch)
{
    switch (ch)
    {
        case 'a' : ++aCnt;
                   break;
        case 'b' : ++bCnt;
                   break;
        default : break;
    }
}
case 标签必须是整形常量表达式,且任两个case 标签值不能相同。

break 语句一般不能省略,如果没写,最好写代码注释一下原因。

最好有default 哪怕什么也没做。


3 循环语句

C++ 主要有while for 和do while 三种循环语句。

while  定义在while 条件部分或循环体内的变量每次迭代都经历从创建到销毁的过程。当不确定循环次数时,使用while 循环比较合适。

for  牢记for 语句头中定义的对象只在for 循环体中可见。C++11引入了一种范围for 语句,可以遍历容器(string vector等)或其他序列的所有元素,因为他们能返回迭代器的begin 和end 成员。如:

vector<int> v={0,1,2,3,4,5};
for (auto &r : v)
    r *= 2;
do while  与while 非常类似,不同之处在于do while 不管条件的值如何,至少执行一次循环,如:

string rsp;  // 定义在循环外部
do
{
    cout<<"please enter two values: ";
    int v1 = 0, v2 = 0;
    cin>>v1>>v2;
    cout<<"the sum of "<<v1<<" and "<<v2
        <<" = "<<v1+v2<<"\n"
        <<"More? Enter yes or no: ";
    cin>>rsp;
} while (!rsp.empty() && rsp[0] != 'n');


4   跳转语句

C++ 有四种跳转语句:break ,continue ,goto 和return。

break  负责终止离他最近的while,do while,for,switch语句,并从这些语句之后的第一条语句开始执行。

continue  终止最近的循环中的当前迭代,并立即开始下一次迭代。

goto    无条件跳转到同一函数内的另一条语句。不要使用goto,它使程序既难理解又难修改。


5  异常处理语句

异常指存在于运行时的反常行为,这些行为超出了函数正常功能的范围。

当程序的某部分检测到一个无法处理的问题时,需要用到异常处理。

C++ 中异常处理包括:

throw 表达式,异常检测使用它来表示遇到了异常。

try catch 语句块,try 语句块中的抛出的异常被catch 子句处理。

异常类,用于在throw 表达式和相关的catch 子句之间传递异常的具体信息。

结构如:

while (cin>>v1>>v2)
{
    try
    {
         if (v1 == v2)
             throw runtime_error("Data is same");
         cout<<v1<<v2;
    } catch (runtime_error err)
    {
         cout<<err.what()
             <<"\nTry again? Enter y or n"<<endl;
         char c;
         cin>>c;
         if (!cin || c == 'n')
             break;
    }
}
当异常被抛出时,首先搜索抛出该异常的函数,如果没有找到匹配的catch 子句,终止该函数,并在调用该函数的函数中继续寻找,沿着程序执行的路径逐层回退,直到找到适当类型的catch 子句。如果最终还没找到,程序转到名为terminate 的标准库函数。一般会导致程序非正常退出。

异常中断了程序的正常流程

对一些程序来说,异常发生时只是简单地终止程序。但对于确实要处理异常并且继续执行的程序,要加倍注意。必须时刻清楚异常何时发生,异常发生后如何确保对象有效,资源无泄漏,程序处于合理状态等。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值