C++Primer第五版【学习笔记】——第五章 语句

1 简单语句

空语句是一个单独的分号

;// null statement

当需要一个语句,但是逻辑上不需要时,使用空语句。比如在一个for循环中,for(i=0; i<num; ++i);

语句块由一组语句组成,由大括号包围

{                              
; // some statements
}                              

当需要一个语句,但是逻辑上需要多个语句时,使用语句块。

2 条件语句

两种版本:

if (condition)
  statement

if (condition)
  statement
else
  statement2

condition可以是一个表达式或者带初始化的变量声明。该表达式或变量必须有一个可以转换成bool的类型。statementstatement2可以是语句块。

[注意]一个很容易犯的错误是忘记加大括号

if (ok)
  if (ok1)
    do();
else
  do1(); //else其实属于内层if
while(ok) 
  do();
  break; //break其实在循环外

3 switch语句

case标志必须是整型常表达式(integral constant expressions)。

尽量加上default标志,即使它什么也没做(空语句),因为这样可以告诉读者我们考虑了这种情况。

3.1 switch语句内的变量定义

当switch条件与一个case标志匹配时,该case标志之前的代码都会被跳过,包括变量定义。所以,在switch语句中定义带有初始化的变量是不合法的,不带初始化的变量则是可以使用的。当然,我们可以将变量定义在语句块中,避免不合法情况。
int a;
	switch(a) {
	case 1:
		int i0; //ok, i0没有初始化
		{string s;} //ok,定义在语句块中;去掉大括号则不合法,因为s被隐式初始化为空串。
	case 2:
		i0 = 2; //ok
		break;
	default:
		;
	}

4 try块和异常处理

C++中的异常处理包括:
  • throw 表达式,当检测部分遇到一个不能处理的事件时,使用throw表达式产生一个异常。
  • try 块,检测部分使用try块处理异常。try块以try关键字开始,结束于一个或多个catch子句,异常会由其中一个catch子句处理。
  • 一组异常类,用来传递关于在一个throw和相关的catch之间发生了什么的信息。
C++库定义了一些用来报告错误的类。主要包含在四个头文件中:
  1. <exception.h>定义了名为exception的异常类。
  2. <stdexcept.h>定义了一组通用异常类。
    <stdexcept>中定义的标准异常类
    exceptionThe most general kind of problem.
    runtime_errorProblem that can be detected only at run time.
    range_errorRun-time error: result generated outside the range of values that are meaningful.
    overflow_errorRun-time error: computation that overflowed.
    underflow_errorRun-time error: computation that underflowed.
    logic_errorError in the logic of the program.
    domain_errorLogic error: argument for which no result exist.
    invalid_argumentLogic error: inappropriate argument.
    length_errorLogic error: attempt to create an object larger than the maximum size for that type.
    out_of_rangeLogic error: used a value outside the valid range.

  3. <new.h>定义了bad_alloc异常类型。
  4. <type_info.h>定义了bad_cast异常类型。
我们只能对exception,bad_calloc和bad_cast类型的对象使用默认初始化,其他的异常类型则必须使用一个string或C-风格字符串初始化。
下面的小程序输入两个数相除,加入了异常处理判断分母是否为0.
#include <iostream>
#include <string>

using namespace std;

int main() {
	float denominator, numerator;
	cout << "输入两个数:" << endl;
	while (cin >> numerator >> denominator) {
		try {
			if (denominator == 0) {
				/*throw runtime_error("Divided by zero!");*/
				throw runtime_error("被零除!");
			}
			cout << numerator << " / " << denominator << " = " 
				 << numerator/denominator << endl;
		}catch (runtime_error err) {
			cout << err.what()
				 << "继续?(Y/N)" << endl;
			char c;
			cin >> c;
			if (!cin || c == 'n') 
				break;
			cout << "输入两个数:" << endl;
		}		
	}	
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

superbin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值