概述
5.语句
5.1简单语句
ival+5;
cout<<ival;//两句都是表达式语句
;//空语句,使用空语句时应加上注释
ival=v1+v2;;//第二个分号表示一个空语句
while();//循环体是空语句
复合语句
复合语句也称为块,用{ }括起来的
块不以分号作为结束
5.2语句作用域
定义在块中的变量或名字只能在块内部以及嵌套在块中的子块访问
5.3条件语句
5.3.1 if-else语句
悬垂else
else总是与离他最近的尚未匹配的if匹配,建议使用花括号{ }区分不同的if-else
5.3.2 switch语句
switch (变量)
case :
break;
case :
break;
default:
break;
- case标签必须是一个整型常量表达式
case 3.14://错误 3.14不是整型
case 'a' ://正确,char类型可以转换成整型常量
- case后面需要表达一个范围的值,比如元音字母
switch(ch)
{
case 'a':
case 'e':
case 'i':
case 'o':
case 'u':
XXXX;
break;
}
- 漏写break;
如果某个case后面的执行语句漏写了break,则后面直接跳过case标签,依次执行对应的内容
- default标签
如果没有任何一个case标签能匹配上switch的值,程序执行default标签
如果switch结构以一个空的default标签作为结束,则该default标签后面必须加上一条空语句或者空块
- switch内部的变量定义
不允许跨过变量的初始化语句直接跳转到该变量作用域内的另一个位置
case true:
//因为程序可能绕开下面的初始化语句,所以switch语句不合法
string file_name;//错误,控制流绕过一个隐式初始化的变量
int ival=0;//错误,控制流绕过一个显式初始化的变量
int jval;//正确,因为jval没有初始化
break;
case false:
//jval虽然在作用域内,但是没有初始化
jval=next_num();//正确,给jval赋值
if(file_name.empty()) //file_name在作用域内,但是没有被初始化
建议每个case标签后面加一个{ },限定作用域
如上,如果case true下面不加{ },jval的作用域就是swtich 的{ }范围
5.4迭代语句
5.4.1 while语句
while(condition)//condition不能为空
statement
//condition可以是一个带初始化的变量声明
//如while(int i=get_num())
5.4.2 for语句
for( )这里叫做语句头,语句头定义的对象只能在for循环体内可见
- for 语句头中可定义多个对象,但是所有变量的类型必须相同
for(decltype(v.size()) i=0,sz=v.size();i!=sz,++i)
- for语句头中的三个表达式都可以省略
5.4.3范围for语句
for(declaration:expression)
statement
//experssion必须是一个序列,比如数组,vector,string,用{}括起来的初始值列表
for(auto c:str);
for(auto &c:str);
5.4.4 do while语句
do
statement
while(condition);//condition使用的变量必须定义在循环体之外
5.5跳转语句
5.5.1 break语句
负责终止离它最近的while,do while,for 或switch语句
5.5.2 continue语句
continue语句只能出现在for、while和do while循环内部
continue表示中断当前迭代,进行下一次的迭代
5.5.3 goto语句
label:
语句
goto label;
//goto语句和label标签必须位于同一个函数之内
- goto语句不能将程序的控制权从变量的作用域之外转移到作用域之内
goto end;
int x=10;
end:
x=22;//错误,goto绕过了一个带初始化的变量定义
向后跳过一个已经执行的定义是合法的
- 跳回到变量定义之前意味着系统将销毁该变量,然后重新创建它;
begin:
int sz=get_size();
if(sz<=0)
{
goto begin; //goto语句执行后销毁sz,sz将重新定义并初始化
}
5.6 try语句块和异常处理
try
{
可能出现问题的代码
if(出现失败)
throw(表达式);
//此语句块定义的变量无法在外部访问,在catch语句内也无法访问
}
catch(异常声明)
{}
catch(异常声明)
{}
//例
try
{
if(item1.isbn()!=item2.isbn())
throw runtime_error("Data must refer to same ISBN");
}
catch(runtime_error err)//runtime_error是一个异常类
{
cout<<err.what()<<endl;
}
寻找处理代码的过程:
首先搜索抛出该异常的函数,
如果没有找到匹配的catch子句,终止该函数,
并在调用该函数的函数中继续寻找,
如果还是没有找到catch子句,这个新的函数也被终止
直到找到适当类型的 catch子句为止
如果最终没有找到任何匹配的catch句子,则转到名为terminate的标准库函数,执行该函数会导致程序非正常退出
如果一段程序没有try语句且发生了异常,系统会调用terminate函数并终止当前程序的执行
- 标准异常类
exception 最常见的问题
runtime_error 只有在运行时才能检测出的问题
range_error 运行时错误:生成的结果超出了有意义的值域范围
overflow_error 运行时错误:计算上溢
underflow_error 运行时错误:计算下溢
logic_error 程序逻辑错误
domain_error 逻辑错误:参数对应的结果值不存在
invalid_argument 逻辑错误:无效参数
length_error 逻辑错误:试图创建一个超出该类型最大长度的对象
out_of_range 逻辑错误:使用一个超出有效范围的值
我们只能以默认初始化的方式初始化exception、bad_alloc和bad_cast对象,不允许为这些对象提供初始值
异常类型只定义了一个what成员函数,该函数没有形参,返回值是一个指向C风格字符串的const char* 返回的内容由编辑器决定
最后
以上就是闪闪翅膀为你收集整理的C++Primer(第五版)第5章笔记:语句5.语句的全部内容,希望文章能够帮你解决C++Primer(第五版)第5章笔记:语句5.语句所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复