控制结构
定义:规定程序语句和程序单元的执行流程
分类:语句级控制结构、单元级控制结构
语句级控制结构
定义:用来构造语句执行流程的机制
分类:顺序、选择(分支)、重复(循环)
顺序
语句结束标记 ;
复合语句:begin……end、{……}
选择
单选if then
二选一if then else
多选一 嵌套if then else
重复
计数器制导
条件制导
单元级控制结构
定义:规定程序单元之间控制流程的机制
显式调用从属单元
eg:
FORTRAN语言的子程序和函数
PASCAL语言的函数和过程
C语言的函数
隐式调用单元——异常处理
异常定义:导致程序正常执行中止的事件
异常处理的主要问题:
- 异常如何说明,它的作用域是什么?
- 异常如何发生?(如何捕获异常)
- 发生异常时,流程如何转移?
- 发生异常时,如何绑定相应的异常处理程序?
- 处理异常之后,控制流程转向何处?
问题(5)的解决方法:
允许控制返回发生异常事件的执行点
这种情况下,异常处理程序可对执行的程序进行“修补”,终止相应的异常事件,以便程序继续正常地执行。
解决了程序继续执行的问题,但并未真正消除发生异常的因素。
由异常处理程序进行控制的转移
意味着引起异常的单元不能恢复执行;从实现的观点来看,这意味着删除异常单元的活动记录。
C++语言的异常处理:
设置陷阱 try
抛出异常 throw
捕获异常 catch
C++的异常处理语句的格式如下:
try { … }
catch (异常类型1) { 异常1处理程序 }
catch (异常类型2) {异常2处理程序}
……
catch (异常类型n) {异常n处理程序}
协同程序间的控制转移关系:
并发单元
eg:“生产者-消费者”问题
并行与并发的区别
并行”是指无论从微观还是宏观,二者都是一起执行的,就好像两个人各拿一把铁锨在挖坑,一小时后,每人一个大坑。
而“并发”在微观上不是同时执行的,只是把时间分成若干段,使多个进程快速交替的执行,从宏观外来看,好像是这些进程都在执行,这就好像两个人用同一把铁锨,轮流挖坑,一小时后,两个人各挖一个小一点的坑,要想挖两个大一点得坑,一定会用两个小时。
从以上本质不难看出,“并发”执行,在多个进程存在资源冲突时,并没有从根本提高执行效率。
同步问题
正确访问存储区
- 不会向已满的缓冲区写数据
- 不会向空缓冲区读数据
动作的“不可分”
append是生产者向缓冲区存数的操作
remove是消费者从缓冲区取数的操作
设t表示所存项目总数
这两个操作都要修改t的值,相应执行操作(1)t:=t+1和(2)t:=t-1来实现。
假定(1)和(2)是这样实现的:
读t到一个专用寄存器;
更新专用寄存器的值;
将专用寄存器的值写到t;则:
执行(1)时不能执行(2),反之亦然。
即,(1)和(2)必须以互斥的方式执行,(1)或(2)是不可分的操作。