C++Primer——《第五章 》语句

目录

while 语句

for语句中的多重定义

范围for语句

do while 语句

break 语句

continue 语句

try 语句块 和 异常处理


 

● 一个表达式,比如 ival+5, 末尾加上分号就变成了表达式语句。表达式语句的作用是执行表达式并丢弃掉求值结果。

● 空语句中只含有一个单独的分号:

如果在程序的某个地方,语法上需要一条语句但是逻辑上不需要,此时应该使用空语句。当循环的全部工作在条件部分就可以完成时,我们通常会用到空语句

注意:使用空语句时应该加上注释,从而令读这段代码的人知道该语句是有意省略的。

注意:多余的空语句并非总是无害的。


● 如果在程序的某个地方,语法是需要一条语句,但是逻辑上需要多条语句,则应该使用复合语句。 例如,while 或者 for 的循环体必须是一条语句,但是我们常常需要在循环体内做很多事情, 此时就需要将多条语句用花括号括起来,从而把语句序列转变成块。

● 注意: 所谓空块,是指内部没有任何语句的一对花括号。空块的作用等价于空语句:

while(cin>>s && s!=sought)
{

}

● 注意: 如果其他代码也需要访问循环控制变量,则该变量必须定义(声明)在语句的外部。 因为控制结构定义的对象的值马上要由结构本身使用, 所以这些变量必须初始化。


● 我们怎么知道某个给定的else 是和哪个if匹配呢? 这个问题通常称作 悬垂 else,C++规定else与离它最近的尚未匹配的if匹配,从而消除了程序的二义性。

● 注意 : 即使不准备在 default 标签下做任何工作, 定义一个default标签也是有用的 。 其目的在于告诉程序的读者, 我们已经考虑到了默认的情况, 只是目前什么也没做。

那么标签不应该孤零零的出现, 它后面必须跟上一条语句或者另外一个case标签。如果 switch结构以一个空的default 标签作为结束, 则该default 标签后面必须跟上一条空语句或一个空块。
 


while 语句


● while 的条件部分可以是一个表达式或者是一个带初始化的变量声明。通常来说,应该由条件本身或者是循环体设法改变表达式的值,否则循环可能无法终止。

while(int i = get_num ())

注意 : 定义在while 条件部分或者 while 循环体内的变量每次迭代都经历从创建到销毁的过程。

● 当不确定到底要迭代多少次时,使用 while 循环比较合适,比如读取输入的内容就是如此。 还有一种情况也应该使用while循环 , 这就是我们想在循环结束后 访问循环控制变量。
 


for语句中的多重定义


● 和其他声明一样, for语句中的 init-statement 也可以定义多个对象。 但是init-statement 只能有一条声明语句, 因此, 所有变量的基础类型必须相同。

       string v = "huang";
	//该循环是把string的元素拷贝一份到原来的元素后面
	for (decltype(v.size()) i = 0, sz = v.size(); i != sz; ++i)
	{
		v.push_back(v[i]);
	}
	for (auto tt = v.begin(); tt != v.end(); ++tt)
	{
		cout << *tt;
	}
	for (auto tt : v)  //等价的循环
	{
		cout << tt;
	}

范围for语句


● for 语句 可以遍历容器或其他序列的所有元素, 范围 for 语句 的语法形式是 :

for (declaration : expression)
{
   statement ;
}

expression 表示的必须是一个序列, 比如用花括号括起来的初始值列表、数组、 或者 vector 或 string 等类型的对象, 这些类型的共同特点是拥有能返回迭代器的begin 和 end 成员。

declaration 定义一个变量, 序列中的每个元素都能转换成该变量的类型。 确保类型相容最简单的办法是使用 auto 类型说明符。 这个关键字可以令编译器帮助我们指定合适的类型。

注意: 如果需要对序列中的元素执行写操作, 循环变量必须声明成引用类型。
 


● 注意: 每次迭代都会重新定义循环控制变量,declaration 部分的变量会被初始化为 expression 部分的下一个元素的值(或者说: 并将其初始化序列中的下一个值)。

● 注意 : 不能通过范围for语句增加vector对象(或者其他容器)的元素了。在范围for语句中, 预存了 end() 的值。 一旦在序列中添加(删除) 元素, end() 函数的值就可能会被移动,使而变的无效了。
 


do while 语句


do 
{ 
statement

} while(condition);` // 注意 : condition使用的变量必须定义在外面

注意 : 因为对于 do white 来说先执行语句或者块, 后判断条件,所以不允许在条件部分定义变量。


break 语句


● break 语句负责终止离它最近的while、do while 、 for 或 switch语句,并从这些语句之后的第一条语句开始执行

● break 语句只能出现在迭代语句或者switch 语句内部(包括嵌套在此类循环里的语句或块的内部)。break 语句的作用范围仅限于最近的循环或者switch。

 


continue 语句


 

● continue语句 终止最近的循环中的当前迭代并立即开始下一次迭代。 continue 语句只能出现在for、while和do while 循环的内部,或者嵌套在此类循环里的语句或块的内部。

和break 语句类似的是, 出现在嵌套循环中continue 语句也仅作用于离它最近的循环。

和break 语句不同 的是, 只有当switch 语句嵌套在迭代语句内部时, 才能在switch 里使用continue

注意: continue 语句中断当前迭代,但是仍然继续执行循环。 对于范围for语句来说, 则是用序列中的下一个元素初始化循环控制变量。
 


try 语句块 和 异常处理


 

● 异常是指存在于运行时的反常行为, 这些行为超出了函数正常功能的范围。 典型的异常包括失去数据库连接以及遇到意外输入等。

● 当程序的某部分检测到一个它无法处理的问题时, 需要用到异常处理。

● 如果程序中含有可能引发异常的代码, 那么通常也会有专门的代码处理问题。
这里写图片描述

● 如果程序发生异常情况, 而在当前环境中获取不到异常处理的足够信息,可以将异常抛出。

● 程序的异常检测部分使用throw 表达式引发一个异常。throw的语句的语法格式为:

throw 表达式;

注意: 其中表达式的类型就是抛出的异常类型。 抛出异常将终止当前的函数, 并把控制权转移给能处理该异常的代码。

● 类型runtime_error 是标准库异常类型的一种, 定义在stdexcept 头文件中。我们必须初始化runtime——error 的对象, 方式是给它提供一个string对象或者一个C 风格的字符串,这个字符串中有一些关于异常的辅助信息。

● throw 作为告知发生异常的语句, 可以出现在任何函数体内。 它与try 和 catch 并没有对应关系。 只不过在try管辖范围内的throw 抛出的异常将被对应的catch捕获。 根据不同的程序, throw 抛出的异常也可能没有被任何的catch 捕获, 但它却尽到了自己告知发生异常的义务。

● 注意: 由于catch 是根据数据类型来判断异常类型的, 所以即使抛出不同的数值, 只要数据类型相同就会执行同一个异常处理语句块。
 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值