#概括
5.1. 表达式和表达式语句;空语句;复合语句(块);
5.2. 控制结构中定义的变量仅内部可见且必须初始化,比如while
和for
语句中的条件部分定义的变量;
5.3. 条件语句包括if
语句和switch
语句;if
语句、if else
语句以及嵌套if
语句;悬垂else
可以使用花括号来使其匹配外层的if
语句;switch
语句默认执行顺序和break
语句的作用;switch
内部定义变量的问题;
5.4. 迭代语句包括while
语句、do while
语句、for
语句以及范围for
语句;for
语句可以省略语句头的某些部分;do while
语句中的条件语句使用的变量必须定义在循环体之外;
5.5. 跳转语句包括break
语句、continue
语句、goto
语句以及return
语句;
5.6. throw
表达式和try`语句块;标准异常类;
#语句
空语句:只含有一个单独的分号;在程序的某个地方,语法上需要一条语句但是逻辑上不需要,此时应该使用空语句;故意省略而添加的空语句应该加上注释;
复合语句:指用花括号括起来的(可能为空的)语句和声明的序列,复合语句也被称作块;如果在程序的某个地方,语法上需要一条语句但是逻辑上需要多条语句,则应该使用复合语句;
#条件语句
if
语句:为了代码的可读性问题,我们应该默认在if
或else
之后写上花括号,while
和for
语句的也应如此。
switch
语句:case
标签必须是整型常量表达式;默认在每个case
里包括最后一个里都添加break
;默认在最后添加default
标签即使不做任何处理;
#switch内部定义变量的问题
##允许跳过变量定义(但该变量不能同时被初始化)
参考switch 语句内部变量的定义问题可以知道:在某个case
标签里定义的变量的作用域为整个switch
语句,直到switch
语句结束而不是到该case
标签的break
语句结束。知道了这一点,我们举例说明该问题:
#include<iostream>
using std::cout;
using std::cin;
using std::endl;
int main()
{
//第一部分
int ival1 = 1;
switch (ival1)
{
case 0:
int i;
break;
case 1:
i = 2;
cout<<i<<endl;
break;
default:
break;
}
//第二部分
int ival2 = 1;
switch (ival2)
{
case 0:
int j = 1;
break;
case 1:
j = 2;
cout<<j<<endl;
break;
default:
break;
}
return 0;
}
在上述代码中,变量i
和变量j
的作用域均为switch
语句。我们首先注释掉第二部分然后编译运行,然后再取消注释进行编译则会出现错误,具体结果如下图所示:
通过上边的例子我们可以得出如下的结论:switch
语句允许跳过变量的定义(但是不允许该变量在定义时被初始化),从而等到使用时再赋值。
##避免该问题的两个方法
1. 尽量不要在switch
语句中定义变量,即使定义变量也千万不要初始化;
2. 如果非要在switch
语句中定义变量,则尽量使用花括号将其作用域限制在块内;
#跳转语句
break
语句:负责终止离它最近的while
、do while
、for
或switch
语句,并从这些语句之后的的一条语句开始继续执行。
continue
语句:终止最近的循环中的当前迭代并立即开始下一次迭代,和break
语句不同的是,只有当switch
语句嵌套在迭代语句内部时,才能在switch
里使用continue
。
goto
语句:从goto
语句无条件跳转到同一函数内的另一条语句,但是我们要避免在程序中使用goto
语句,因为它使得程序既难理解又难修改。
2017-12-23更新说明:
goto
语句也存在switch
语句相同的问题,即:goto
语句允许跳过变量的定义(但是不允许该变量在定义时被初始化),从而等到使用时再赋值。
return
语句:包括有返回值和无返回值两种形式;
-
无返回值的
return
语句只能用在返回类型是void
的函数中(该函数在没有return
语句的情况下也会隐式执行return
),也可以用来提前退出void
函数;void
函数也可以使用有返回值的return
语句不过其返回的必须是另外一个void
的函数; -
有返回值的
return
语句用在返回类型不是void
的函数中,两者的返回类型应该相同或者可以隐式转换;main
函数是个例外:在没有return
语句时会隐式地执行一条返回0的return
语句;
#throw表达式和try语句块的使用
我们以习题5.25为例:从标准输入中读取两个整数,如果分母为0则抛出异常并输出一条提示信息,询问其是否输入新数并重新执行try
语句块的内容。具体的实现代码如下所示:
#include<iostream>
#include<stdexcept>
using std::cout;
using std::cin;
using std::endl;
using std::runtime_error;
int main()
{
int ival1,ival2;
cout<<"請輸入被除數和除數"<<endl;
while(cin>>ival1>>ival2)
{
try
{
if (ival2 == 0)
throw runtime_error("the denominator must not be 0");
else
cout<<"the result is:\t"<<ival1/ival2<<endl;
}
catch(runtime_error err)
{
cout<<err.what()
<<"\nTry Again? Enter another two numbers"<<endl;
char c;
cin>>c;
if (!cin || c == 'n')
break;
}
}
return 0;
}
我们对该程序进行编译并运行,具体的结果如下图所示: