1 简单语句
空语句是一个单独的分号
;// null statement
当需要一个语句,但是逻辑上不需要时,使用空语句。比如在一个for循环中,for(i=0; i<num; ++i);
语句块由一组语句组成,由大括号包围
{
; // some statements
}
当需要一个语句,但是逻辑上需要多个语句时,使用语句块。
2 条件语句
两种版本:
if (condition)
statement
和
if (condition)
statement
else
statement2
condition可以是一个表达式或者带初始化的变量声明。该表达式或变量必须有一个可以转换成bool的类型。statement和statement2可以是语句块。
[注意]一个很容易犯的错误是忘记加大括号
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++库定义了一些用来报告错误的类。主要包含在四个头文件中:
- <exception.h>定义了名为exception的异常类。
- <stdexcept.h>定义了一组通用异常类。
<stdexcept>中定义的标准异常类 exception The most general kind of problem. runtime_error Problem that can be detected only at run time. range_error Run-time error: result generated outside the range of values that are meaningful. overflow_error Run-time error: computation that overflowed. underflow_error Run-time error: computation that underflowed. logic_error Error in the logic of the program. domain_error Logic error: argument for which no result exist. invalid_argument Logic error: inappropriate argument. length_error Logic error: attempt to create an object larger than the maximum size for that type. out_of_range Logic error: used a value outside the valid range.
- <new.h>定义了bad_alloc异常类型。
- <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;
}