《C++ Primer》【Chapter 5】
chapter5 语句
1 简单语句
表达式语句:表达式+分号
ival + 4;
2 语句作用域
定义在控制结构当中的变量只在相应语句的内部可见,一旦语句结束,变量也就超出其作用范围了
3 条件语句
3.1 if
为避免出错,一般要在if或else之后写上花括号。
-
悬垂else(dangling else)
else与离它最近的尚未匹配的if匹配,从而消除程序的二义性。
if (grade%10 >= 3)
if(grade%10 > 7)
statement
else //if(grade%10 > 7)匹配
statement2
3.2 switch
如果某个 case 标签匹配成功,将从该标签开始往后顺序执行所有 case 分支,除非程序显式地中断了这一过程 , 否则直到 switch 的结尾处才会停下来。要想避免执行后续 case 分支的代码 ,我们必须显式地告诉编译器终止执行过程。大多数情况下,在下一个 case 标签之前应该有一条break语句。
更通俗的理解就是,某个case条件满足后,从满足条件的case一直往后执行,直到结束或碰见break
如果程序的流程绕开了某个case,而后面运行的case的某个变量是在前面定义的,则会报错,所以最好是在哪个case块使用,就在哪个case块定义并初始化。
switch(flag) {
case true:
int a = 3;
case false:
cout << a << endl; //flag=false时,a并没有定义和初始化,这样肯定不对。
//最好写成
case false:
int a = 3;
cout << a << endl; // 最好就是要在哪里用就在哪里定义和初始化。
}
4 迭代语句
4.1 范围for语句
C++11的新标准
for(declaration : expression) // expressio 必须是一个序列
statement;
需要修改序列中的元素时,需要加引用
vector<int> A = {0,1,2,3,4,5,6,7};
for(auto &it:A) {
it *= 2;
}
4.1 do while语句
格式:
do
statement
while(condition); //末尾的分号不能忘记
5 跳转语句
break、continue、goto和return,goto用的少点,重点关注一下
goto语句
goto语句的作用是从goto语句无条件跳转到同一函数内的另一条语句
begin:
int sz = A.size();
if(sz == 6) {
cout << sz << endl;
goto begin; //goto语句执行后,会销毁之前定义的sz
}
try语句块和异常处理
在C++中异常处理包括:
- throw表达式,异常检测部分使用throw表达式来表示它遇到了无法处理的问题。我们说throw引发(raise)了异常。
- try语句块,异常处理部分使用try语句块处理异常。 try语句块以关键字try开始,并以一个或多个catch子句结束。try语句块中代码抛出的异常通常会被某个catch子句处理。因为 catch子句"处理"异常,所以它们也被称作异常处理代码 (exception handler)。
- 一套异常类(exception class),用于在throw表达式和相关的catch子句之间传递异常的具体信息 。
异常中断了程序的正常流程。异常发生时,调用者请求的一部分计算可能已经完成了,另一部分则尚未完成。通常情况下, 略过部分程序意味着某些对象处理到一半就戛然而止,从而导致对象处于无效或未完成的状态,或者资源没有正常释放,等等。那些在异常发生期间正确执行了"清理"工作的程序被称作异常安全 ( exception safe )的代码 。然而经验表明,编写异常安全的代码非常困难。
异常类型只定义了一个名为what的成员函数,该函数没有任何参数,返回值是一个指向C风格字符串的const char*。该字符串的目的是提供关于异常的一些文本信息。