转载请注明原文出处:http://blog.youkuaiyun.com/roddick621
以下的知识点全部都是来自于C++ Primer 第四版,如果需要详细了解的话,可以查看原版的书籍。
1.简单语句
C++中大多数语句以分号结束。最简单的语句就是空语句(null statement)。语法就是只有一个分号(;)。
2.声明语句
在C++中,对象或类的定义或声明也是语句。尽管定义语句也许更准确写,但定义语句经常被称为声明语句。
3.复合语句
复合语句,通常被称为块,是用一堆花括号括起来的语句序列(也可能是空的)。符合语句用在语法规则要求使用单个语句但程序逻辑却需需要不止一个语句的地方。
4.语句作用域
有些语句允许在他们的控制结构中定义变量。在语句的控制结构中定义的变量,仅在定义他们的块语句结束前有效。对于在控制语句中定义的变量,限制其作用域的一个好处是,这些变量尅重复使用而不必担心它们的当前值在每一次使用时是否正确。
5.if语句
if语句根据特定表达式是否为真来有条件地执行另一个语句。if语句有两种形式:其中一种带else分支而另一种则没有。C++中悬垂else问题带来的二义性,通过讲else匹配给最后出现的尚未匹配的if子句来解决。
//最简单的if语句
if(confition)
statement
//if else语句的语法形式
if(condition)
statement1 //可为语句块
else
statement2
6.switch语句
6.1 使用switch
char ch;
cin >> ch;
switch (ch) {
case 'a': ...; break;
case 'b': ...; break;
case 'c':
case 'b': ...; break; //c , d执行相同的操作
...
default: ...; break;
}
如果表达式与其中一个case标号的值匹配,则程序将从标号后面的第一个语句开始一次执行各个语句,知道switch结束或遇到break语句为止。如果没有遇到匹配的case标号(并且没有default标号),则程序从switch语句后面的第一条语句继续执行。
6.2 switch中的控制流
为了避免执行完某个特定标号对应的代码后继续执行后续的case标号的内容,程序员必须使用break语句清楚地告诉编译器停止执行switch中的语句。如果需要两个或多个case值由相同的动作序列来处理,则把case标号依次排列,中间可以不添加break。
6.3 default标号
default标号提供了相当于else子句的功能。如果所有的case标号与swit表达式的值都不匹配,并且default标号存在,则执行default标号后面的语句。一个标号不能独立存在,它必须在语句之前。如果switch结构以default标号结束,而且default分支不需要完成任何任务,那么该标号后面必须有一个空语句。
6.4 switch 表达式与case 标号
switch求解的表达式可以非常复杂,该表达式可以定义和初始化一个变量。case标号必须是整型常量表达式。
6.5 switch 内部的变量定义
对于switch结构,只能够在它的最后一个case标号或default标号后面定义变量。制定这个规则是为了避免出现代码跳过变量的定义和初始化的情况。
7.while语句
当条件为真时,while语句反复执行目标语句。他的语法形式如下:
while (condition)
statement
8.for循环语句
for语句的语法形式是:
//init-statement:必须是声明语句、表达式语句或空语句。这些语句都以分号结束
for(init-statement condition;expression)
statement
或者:
for(initializer; condition; expression)
statement
8.1 省略for语句头的某些部分
for语句头中,可以省略init-statement(初始化语句)、condition(循环语句)或者expression(表达式)中的任何一个(或全部)。
8.2 for语句头中的多个定义。
可以在for语句的init-statement中定义多个对象;但是不管怎么样,该处只能够出现一个语句,因此所有的对象必须具有相同的一般类型。
9.do while语句。
语法格式如下:
do
statement
while(condition); //与while不同,do while语句总是以分号结束。
10.break语句
break语句用于结束最近的while, do while, for 或 switch语句,并将程序的执行权传递给紧接在被终止语句之后的语句。
11.continue语句
continue语句导致最近的循环语句的当次迭代提前结束。对于while和do while语句,继续求解循环条件,而对于for循环,程序流程接着求解for语句头中的expression表达式。
12.goto语句
goto语句提供了函数内部的无条件跳转,实现了从goto语句跳转到同意函数内某个带标号的语句。goto语句的语法规则如下:
goto lable; //lable是用于标识带标号的语句的标识符。
在任何语句前提供一个标识符和冒号,即得带 标号的语句。
13.try块和异常处理
C++的异常处理包括:
throw 表达式:错误检测部分使用这种表达式来说明遇到了不可处理的错误。可以说,throw引发了异常条件。
try块:错误处理部分使用它来处理异常。try语句块以try关键字开始,并以一个或多个catch子句结束。在try块中执行的代码抛出的异常,通常都会被其中一个catch子句处理。由于他们“处理”异常,catch子句也称为处理代码。
由标准库定义的一组异常类,用来在throw和相应的catch之间传递有关的错误信息。
13.1 throw表达式
系统通过throw表达式抛出异常。throw表达式由关键字throw以及尾随的表达式组成。通常以分号结束,这样它就成为了表达式语句。throw表达式的类型决定了所抛出异常的类型。
13.2 try块
try块的通用语法形式是:
try {
program-statements
} catch (exception-specifier) {
handler-statements
} catch (exception-specifier) {
handler-statements
} //...
try块以关键字try开始,后面是用花括号括起来的语句序列快。try块后面是一个或多个catch子句。每个catch子句包括三部分:关键字catch,圆括号内单个类型或者单个对象的声明----称为异常说明符,以及通常用花括号括起来的语句块。如果选择了一个catch字符来处理异常,则执行相关的块语句。一旦catch子句执行结束,程序流程立即继续执行紧随的最后一个catch子句的语句。
13.3 标准异常
C++标准库定义了一组类,用于报告在标准库中的函数遇到的问题。标准库异常定义在四个头文件中:
(1)exception头文件定义了最常见的异常类,它的类名是exception。这个类只通知异常的产生,但不会提供更多的信息。
(2)stdexcept头文件定义了集中常见的异常类。
(3)new头文件定义了bad_alloc异常类型,提供了无法分配内存而由new抛出的异常。
(4)type_info头文件定义了bad_cast异常类型。
14.使用预处理器进行调试
可以在代码中使用NDEBUG预处理变量实现有条件的调试代码:
int main()
{
#ifndef NDEBUG
cerr << "string main" <<endl;
#endif
//...
默认的情况下,NDEBUG未定义,这就意味着不会执行#ifndef和#endif之间的代码。如果需要,可以在编译的之后把参数-DNDEBUG传给编译器,这样的命令等效于在main.c的开头提供#define NDEBUG预处理命令。
预处理器还定义了其余四种在调试时非常有用的常量:
__FILE__ 文件名
__LINE__ 当前行
__TIME__ 文件被编译的时间
__DATE__ 文件被表意的日期