『C++ Primer学习笔记』Chapter 5

#概括
5.1. 表达式和表达式语句;空语句;复合语句(块);

5.2. 控制结构中定义的变量仅内部可见且必须初始化,比如whilefor语句中的条件部分定义的变量;

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语句:为了代码的可读性问题,我们应该默认在ifelse之后写上花括号,whilefor语句的也应如此。

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语句:负责终止离它最近的whiledo whileforswitch语句,并从这些语句之后的的一条语句开始继续执行。

continue语句:终止最近的循环中的当前迭代并立即开始下一次迭代,和break语句不同的是,只有当switch语句嵌套在迭代语句内部时,才能在switch里使用continue

goto语句:从goto语句无条件跳转到同一函数内的另一条语句,但是我们要避免在程序中使用goto语句,因为它使得程序既难理解又难修改。

2017-12-23更新说明:

goto语句也存在switch语句相同的问题,即:goto语句允许跳过变量的定义(但是不允许该变量在定义时被初始化),从而等到使用时再赋值。

return语句:包括有返回值和无返回值两种形式;

  1. 无返回值的return语句只能用在返回类型是void的函数中(该函数在没有return语句的情况下也会隐式执行return),也可以用来提前退出void函数;void函数也可以使用有返回值的return语句不过其返回的必须是另外一个void的函数;

  2. 有返回值的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;
}

我们对该程序进行编译并运行,具体的结果如下图所示:
这里写图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值