第六章 语句
1.一些看似非法的分号往往只不过是一个空语句而已:
ival = v1 = v2;; //ok
上面一共两条语句:一条表达式语句和一条空语句;
2.对于switch结构,漏写break语句是常见的错误;
3.switch求解的表达式可以非常复杂,而case标号必须是整型常量表达式;
//非法标号值
case 3.14; //非整型
case ival; //非常量
4.只能在最后一个case标号或default标号后面定义变量:避免出现代码跳过变量的定义和初始化;
5.do while语句总是以分号结束,do内部定义的变量作用域限制在while前的右花括号之前;
do
statement
while (condition);
6.break语句用于结束最近的while,do while,for,switch语句;
7.标号标识符只能用作goto的目标,因此可以与变量名等重名,但不得与其他标号标识符重名;
goto语句和获得所转移的控制权的带标号的语句必须位于同一函数内;
goto语句不能跨变量定义跳转(如果确实需要,可将定义放到一个块语句中);
8.在try块中,一旦catch子句执行结束,程序流程立即继续执行紧随着最后一个catch子句的语句;
9.使用预处理器进行调试:
int main()
{
#ifndef NDEBUG
cerr<<"starting main"<<endl;
#endif
// ..
}
如果NDEBUG未定义,则将信息写到cerr中;
如果定义了,则跳过该段代码;
故在开发阶段,可以保持NDEBUG未定义,而在释出阶段,可以通过定义NDEBUG删除这些调试语句:
$ cc -DNDEBUG main.c
上面语句等价于在main.c开头添加 #define NDEBUG ;
assert(断言)预处理宏:只要NDEBUG未定义,assert宏就求解其后面的条件表达式,如果结果为false,则输出信息并终止程序;
通常使用assert来测试“不可能发生”的条件。