简单语句
空语句
;
复杂语句(块,block)
花括号括起来的语句和声明的序列,每块一个作用域。
作用域
条件语句
if
if…else if…else…
- 嵌套if
- 垂悬else:同层if和else放同一列
switch
- case后不能接对象,必须是整数常量表达式
int n;
int arr[5] = {0,0,0,0,0};
while (cin >> n) {
switch (n) {
case 0: ++arr[0];
break;
case 1:case 5: //两种条件并列方法
++arr[1];
int a ;
a = 0; //这两句正确
int a = 1; //这句错误,定义在了switch块内,但其他case收不到初始化值。
break;
case 2:{++arr[2];
int b = 1; //这句正确,在case2的块内初始化可以
}
break;
case 3: ++arr[3];
break;
case 4:++arr[4];
break;
default: break;
}
}
for (int i = 0; i < 5; ++i) {
cout << "arr[" << i << "]:" << arr[i] << endl;
}
迭代语句
while
while(condition){statement}
- 不确定迭代多少次时使用while
- while条件和内部变量经历着从创建到销毁的过程。
for
for(initializer;condition;expression){statement}
- initializer中可以定义多个变量,但声明只有一条,所以定义的多个变量必须是同一类型。
for(decltype(s.size())i = 0;sz = s.size();i<sz;++i)
- 语句头initializer,condition,expression都可以省略。
范围for
for(declaration:expression){statement}
vector<int> n = {1,2,3,4,5,6,7,8};
for(auto &num:n)
{ ;}
do…while
do{statement}while(condition);
- statement执行一次再判断condition,condition不能为空
string s;
do {
int val, val2;
cout << "input two numbers";
cin >> val >> val2;
cout << "sum:" << val + val2 << endl;
cout << "more?y/n" << endl;
cin >> s; //直接覆盖之前的值
cout << s << endl;
} while (!s.empty() && s[0] != 'n'); //这里要有个分号
跳转语句
break
- 负责终止离它最近的while、do while、for或switch语句。执行这些语句后的第一条语句。
continue
- 终止最近循环的当前迭代,立即开始下一次迭代。
goto
goto label;
- labeled statement 带标签语句
end:return; //带标签语句,可以作为goto目标
- 不能将程序控制从变量作用域之外到变量作用域之内。
string s;
begin:
int val, val2; //goto语句执行后,销毁val,val2
cout << "input two numbers";
cin >> val >> val2;
cout << "sum:" << val + val2 << endl;
cout << "more?y/n" << endl;
cin >> s;
cout << s << endl;
if (!s.empty() && s[0] != 'n') {
goto begin;
}
try语句块和异常处理
异常
- 异常是指存在于运行时的反常行为,这些行为超出函数正常功能范围。典型异常如失去数据库连接,遇到意外输入等。当程序检测到无法处理的部分,需要用到异常处理。
- 异常包括异常检测和异常处理两部分。检测部分发出信号表明程序遇到故障,该信号无需知道故障在何处得到解决;处理部分会对异常进行相应处理,比如输入无效,处理部分会要求用户重新输入正确数据;如果丢失数据库连接,会发出警报等。
- 检测部分使用throw表达式表示,可以说throw引发了异常。处理部分使用try语句块处理。
- 异常类:用于在throw表达式和相关catch子句之间传递异常的具体信息。
throw表达式
使用throw表达式引发一个异常,抛出异常类型见最后。
throw type(expression);//关键词throw+抛出异常类型+表达式
cin >> val >> val2;
if(val>100||val1>100){
throw runtime_error("number must less than 100!") //
}
try语句块
- try语句块以关键字try开始,以一个或多个catch子句结束。try语句中代码抛出的异常通常会被某个catch子句处理。catch子句处理异常,也成为异常处理代码。
- 如果没有找到任何匹配的catch子句,程序会转到terminate的标准库函数,执行该函数将导致程序非正常退出。
try{
program-statements
}catch(exception-declaration){ //异常声明
handler-statements
}catch(exception-declaration){
handler-statements
}//...
#include <iostream>
#include <string>
#include <exception>
#include <stdexcept>
using namespace std;
int main() {
string s;
begin:
int val, val2;
cout << "input two numbers";
cin >> val >> val2;
try {
if (val > 100 || val2 > 100) {
throw runtime_error("number must less than 100!");
}
} catch (runtime_error err) { //异常声明,err的类型是runtime_error
cout << err.what() //what是runtime_error的成员函数,返回"number must less than 100!"
<< "\nTry again?y/n" << endl;
char c;
cin >> c;
if (c == 'y') {
goto begin;
} else {
return 0;
}
}
cout << "sum:" << val + val2 << endl;
cout << "more?y/n" << endl;
cin >> s;
cout << s << endl;
if (!s.empty() && s[0] != 'n') {
goto begin;
}
return 1;
}
标准异常
C++定义了一组类,用来报告标准库函数遇到的问题。
- 头文件
#include<exception> //最通用的异常类,报告异常发生
#include<stdexecpt> //常用异常类
#include<new> //bad_alloc异常类型
#include<type_info> //bad_cast异常类型
- C++ <stdexcept>定义的异常类
- exception、bad_alloc和bad_cast异常类只能默认初始化,不能提供初始值。其他要用string或char[]型初始化这些类型对象,不能默认初始化。
- 异常类型定义了一个what成员函数,该函数没有任何参数,返回值是const char*。是关于异常的一些文本信息。