第6章 语句

来源:互联网 发布:mac pro2012装win7 编辑:程序博客网 时间:2024/06/05 03:14

6.1、简单语句

       使用空语句应该加上注释。

6.5、if语句

       多个if语句,但后面跟的else比if少,导致匹配存在歧义,这就是悬垂else(dangling-else)问题。

6.6、switch语句

       例如:switch(ch){

       case ‘a’: 语句;break;

       ···

       default:语句;break;

}

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

char a = 'a';

       switch(a){

              case'a':int i =1;break;//这边定义i编译出错

              case'b':cout<<i<<endl;break;

              default:cout<<"default"<<endl;break;

       }

       这个规则是为了避免出现代码跳过变量的定义和初始化的情况。只能在它的最后一个case标号或者default标号后面定义变量(就是最后一种情况里面才能定义)。

       如果只是针对如情况’a’才用i,可以对i的定义加上大括号,形成块语句,在块语句里面就可以定义和初始化了。

6.7、while语句

       在循环条件中定义的变量在每次循环里都要经历创建和撤销过程。

6.8、for循环语句

       for(int ival = 0,*pi = ia,&ri = val;条件;后续动作)。第一个分号前面可以定义多个对象,但所有对象必须具有相同类型。显然,因为只有一个语句,你无法定义更多类型。

6.10、break语句

       for里面嵌套switch,switch里面的break只能跳出switch,不能跳出外面的for。

6.12、goto语句

       最好不用,了解下:goto label;label是用于标识带标号的语句的标识符。在任何语句前提供一个标识符和冒号,既得带标号的语句。它可以与变量名以及程序里其他标识符一样。goto语句和获得所转移的控制权的带标号的语句必须位于同一个函数内

6.13、try块和异常处理

       像通信交换机和路由器这类长期运行的交互式系统必须将90%的程序代码用于实现错误检测和错误处理。

       throw表达式,错误检查部分使用这种表达式来说明遇到不可处理的错误。throw表达式由关键字throw以及尾随的表达式组成,通常以分号结束。如:throw runtime_error(“出错信息”);其中,runtime_error类型是标准库异常类中的一种,在stdexcept头文件中定义。

       try块,错误处理部分使用它来处理异常。并以一个或多个catch子句结束。catch子句也称为处理代码。try-catch后面的语句无论前面有无异常都能执行。如:

try{

}catch(异常说明符,如runtime_error err){块语句}

       catch中可以用err.what()输出throw的内容,每个标准库异常类都定义了且只定义了名为what的成员函数操作,该函数不需要参数,返回C风格字符串。

       如果不存在处理该异常的catch子句,程序的运行就要跳转到名为terminate的标准库函数,该函数在exception头文件中定义。它的执行将导致程序非正常退出(此时异常信息没有给予提示)。

       C++异常基本与java相同,只是java以C++为鉴,做的更好。如(1)finally能够保证资源在异常情况下的回收。(2)所有的异常都必须从 Throwable 继承而来。(3)对异常处理的管理更严格,也更严谨。在 Java 的异常处理模型中,要求所有被抛出的异常都必须要有对应的“异常处理模块”。

6.13.3、标准异常

       标准库异常类定义在四个头文件中:

(1)exception头文件定义了最常见的异常类,类名是exception。(2)stdexcept头文件定义了几种常见的异常类。(如exception最常见的问题;runtime_error运行时错误;range_error生成结果超出了有意义的值域范围;overflow_error上溢;逻辑错误invalid_argument不合适的参数;length_error超出类型最大长度等)(3)new头文件定义了bad_alloc异常类型,提供因无法分配内存而由new抛出的异常。(4)type_info头文件定义了bad_cast异常类型。

6.14、使用预处理器进行调试

         程序所包含的调试代码仅在开发过程中执行,当应用程序已经完成,并且准备提交时,就会将调试代码关闭。

         可使用NDEBUG预处理变量实现有条件的调试代码。如#ifndef NDEBUG 语句 #endif。

         默认情况下,NDEBUG未定义。开发完交付后,可通过定义NDEBUG预处理变量,有效删除这些调试语句。大多数编译器都提供定义NDEBUG的命令行选项:如,$ CC–DNDEBUG main.c这命令行等效于在main.c的开头提供#defineNDEBUG预处理命令。预处理器还定义了其余四种在调试时非常有用的常量:_ _FILE_ _文件名;_ _LINE_ _当前行号;_ _TIME_ _文件被编译的时间;_ _DATE_ _文件被编译的日期(直接可以拿来输出)。

         assert预处理宏(preprocessormacro)。assert宏是在cassert头文件中定义,所有使用assert的文件必须包含这个头文件。用法:assert(表达式);

         结合NDEBUG:

         #ifdefNDEBUG

         #defineassert(x) ((void)0)

         #else