目录
5.1 简单语句
空语句
只写一个分号为一个空语句
复合语句/块
用花括号包括一系列语句,用作一条语句
5.2 语句作用域
while(int i=get_num())
{
int j=i;
}
如上图,每次迭代,i和j重新初始化 ,再消除
5.3 条件语句
if语句
不含else分支
含else分支
悬垂else
指else与它最近的if匹配
if()//#1
/* ...*/
if()//#2
/* ...*/
else
/* ...*/
上图中,else与#2if匹配
if()
{
/* ...*/
if()
/* ...*/
}
else
/* ...*/
上图中,else与#1 if匹配
switch语句
格式 swtich(expression)
为expression求值,并根据不同case给出的值对应expression的值匹配
格式 case 标签:
标签必须是整型常量表达式(包括char),不能是变量,并且该表达式只能表达一个值,不能用逻辑关系式||或&&
default表示默认情况(即除了case)
若每个case没有break,则继续往下执行;有时候想要不同case共享操作,则可以最后写break如:
case'A':
case'B':
++cnt;
break;
case'C':
break;
switch内部变量定义
如果想在case内定义并初始化变量,则需要在这个case内用块包含定义的变量,则该变量作用域即为这个块内
case true:
{
string file_name=get_file_name();
}
break;
case false:
if(file_name.empty())//错误,file_name不在该作用域之内
典例
5.4 迭代语句
while语句
适用场景:条件不变,重复执行或者不确定重复多少次
for语句
传统for语句:
适用场景:有迭代器参与或下标参与
范围for语句:
适用场景:遍历容器内所有元素
do while语句
适用场景:先执行再判断条件,除此之外与while相似
格式(注意condition使用的变量需要定义在循环体之外,因为该变量很有可能存在statement中)
do
statement
while(condition);
5.5 跳转语句
break语句
负责终止离它最近的循环结构(for,while,do while)或switch语句,从这些语句之后的下一条开始继续执行
continue语句
负责终止最近的循环中的当前迭代,并立即开始下一次迭代
goto语句(不用)
return语句(不在这介绍)
5.6 try语句块和异常处理
异常处理机制介绍
包括异常检测和异常处理
异常处理三部分:throw异常检测语句,try语句块,异常类
标准异常
throw表达式
格式:
throw 错误类型表达式;
try语句块
格式
try
{
program-statement;
}
catch(异常声明)
{
handle-statement;
}
catch(异常声明)
{
handle-statement;
}
program-statement:正常的程序,包含throw
异常声明,即声明一个对象(可能未命名)
handle-statement:解决的方法
当throw检测出异常,检索该异常对应的catch:
若对应上,则执行该catch块内语句,执行完后,跳转到try语句块的最后一个catch语句之后的那条语句继续执行
若对应不上,则程序转到名为terminate的标准库函数,一般执行该函数会导致程序非正常退出
典例:
#include<iostream>
#include<stdexcept>
using std::cout;
using std::endl;
using std::cin;
int main()
{
int n1, n2;
char c;
while (cin >> n1 >> n2)
{
try
{
if (n2 == 0)
throw std::runtime_error("除数为0");
else
cout << static_cast<double>(n1) / n2 << endl;
}
catch (std::runtime_error err)
{
cout << err.what() << endl;
cout << "是否要重新输入?Enter 'y' or 'n' " << endl;
cin >> c;
if (!cin || c == 'n')
break;
else
{
cout << "please enter again two correct numbers:" << endl;
}
}
}
}