[c++primer][06]语句

6.1 简单语句

无关的空语句并非总是无害的。

 

6.2 声明语句

6.3 复合语句

也称为块,是用一对花括号括起来的语句序列。块标识了一个作用域,一个名字只从其定义处到该块的结尾这段范围内可见。

6.4 语句作用域

在语句的控制结构中定义的变量,仅在定义它们的块语句结束前有效。

6.5 if语句

类类型能否用在条件表达式中取决于类本身。IO类型可以用作条件,vector和string类型一般不可用作条件。

悬垂else

默认地,else匹配给最后出现的尚未匹配的if子句。

代码风格

总是在if语句后使用花括号是一个比较好的做法

6.6 switch语句

使用switch语句

实际上,程序从匹配的case标号开始,并跨越case边界继续执行其他语句,直到switch结束或遇到break语句为止。

最好在每个case标号后面提供一个break语句。

允许程序向下执行多个case标号,可以这么写:

 

case标号必须是整型常量表达式,否则会编译错误;如果两个case标号具有相同的值,同样也会导致编译时的错误。

如需要为某个特殊case定义变量,可以引入块语句,在块语句中定义变量,从而保证这个变量在使用前被定义和初始化。

default标号

哪怕没有语句要在default标号下执行,定义default标号仍然是有用的,表明该情况考虑到了。

如果switch结构以default标号结束,而且default分支不需要完成任何任务,那么该标号后面必须有一个空语句。

6.7 while语句

数组内容复制

 

6.8 for循环语句

for(initializer; condition; expression)
    statemant

for语句头定义的对象只在for循环体里可见;可在for语句的initializer中定义多个对象,但该处只能出现一个语句,因此所有对象必须为同一类型。

6.9 do while语句

do
  statement while(condition); //注意,以分号结束

任何在循环条件中引用的变量都必须在do语句之前就已经存在。

6.10 break语句

break只限用于switch或循环语句中,用以跳出最内层的switch或循环语句

6.11 continue语句

用于使最近的循环语句当次迭代提前结束,继续求解循环条件;

对于for循环,程序流程接着求解for语句中的expression表达式。 

6.12 goto语句

提供了函数内部的无条件跳转,不建议使用。

6.13 try块和异常处理

异常机制提供程序中错误检测与错误处理部分之间的通信。C++的异常处理有:

1)throw表达式,错误检测部分用该表达式来说明遇到不可处理的错误,throw引发了异常条件;

2)try块,错误处理部分使用它来处理异常。以try开始,并以一个或多个catch子句结束。try块中执行的代码所抛出的异常,会被其中一个catch子句处理,catch子句也称为处理代码

3)由标准库定义的一组异常类,用来在throw和相应的catch之间传递有关错误信息。

try块

以下,假设标准输入检查输入的数字不能为0

#include <iostream>
#include <stdexcept>
using namespace std;

int main()
{
    int val;
    cout << "Enter a number(not 0):";
    while(cin >> val){
        try{
            if(!val){
                throw runtime_error("wrong,it's zero !");
            }
            cout << "ok !" << endl;
        } catch (runtime_error err){
            cout << err.what()
                <<"\nTry Again? Enter y or n " << endl;
            char c;
            cin >> c;
            if(cin && c=='n')
                break;
        }
    }
    return 0;
}

函数在寻找处理代码的过程退出

复杂系统中,可能存在try嵌套调用,寻找处理代码的过程与函数调用链刚好相反。如果没有找到相应的处理代码,按执行路径回退,直到找到适当类型的catch为止。

如果不存在处理该异常的catch子句,程序跳转到terminate函数执行,它的执行导致程序非正常退出;

在程序中出现的异常,如果没有经过try块定义,发现异常时系统将自动调用terminate终止程序的执行。

标准异常

6.14 使用预处理器进行调试

NDEBUG预处理变量

默认情况下,NDEBUG未定义,程序处于debug状态,有以下两种情况:

1)开发过程执行的调试代码

#ifndef NDEBUG
cout << “debug info” << endl;
#endif  //#ifndef 和 #endif之间的代码默认执行

2)assert(断言)宏在头文件cassert中定义,用来测试“不可能发生”的条件

assert (expr);

如果表达式为true,assert不做任何操作,若表达式为false,assert输出信息并终止程序的执行

当使用 -DNDEBUG 命令行选项定义NDEBUG时,或在程序开头提供#define NDEBUG预处理命令,以上两种调试语句都不会执行。

预处理器定义的几个常量

_ _FILE_ _    name of the file.
_ _LINE_ _   current line number.
_ _TIME_ _   time the file was compiled.
_ _DATE_ _  date the file was compiled.

_ _ func_ _   name of the function

posted @ 2015-09-14 00:39  treeland  阅读(212)  评论(0编辑  收藏  举报