文档介绍:第7章程序控制
冯·诺依曼机器模型变量的时空特性对程序中求值的次序是十分敏感的
表达式的求值次序是最低层的程序控制,在它的上层是四类控制:顺序控制、选择控制、重复(迭代)、函数或过程调用
再上一层是对程序模块的控制。包括一个程序的各模块组织以及它们与环境的相互关系
并发控制也是一类控制,它可以在语句级,特征块和模块级实施并发控制
,
一般概述
语句级控制由于GOTO危害导致结构化程序。
1966年Boehm和Jacopini回答了这个问题:任何流程图的计算逻辑都可以用顺序组、条件选择组、迭代组三种程序结构实现。
保留GOTO的积极作用限制GOTO的副效应, 把它们改头换面变为比较安全的顺序控制器(sequencer)。
命令式语言只要有赋值语句V∶=EXP,简单的逻辑条件IF(e)和GOTO语句就可以编出一切计算程序(输入/出除外)。
顺序控制
S1; S2
进一步扩展可为: S1; S2; …;Sn
Ada语句较全:
简单_语句::=空_语句
|赋值_语句| 过程调用_语句
|goto_语句| 入口调用_语句
|出口_语句| 返回_语句
|引发_语句| 夭折_语句
|延迟_语句| 代码_语句
其中空_语句,赋值_语句,延迟语句,代码_语句不影响控制和转移,exit(出口)语句,raise(引发)语句,abort(夭折)语句,return(返回)语句都是顺序控制器。
条件选择控制
if(e)无结构。Algol60改为if…then…else结构,
退化是if…then
悬挂else
if E1 then if E2 then S1 else S2 E1为‘真’‘假’均可执行S2
解决if E1 then begin if E2 then S1 else S2 end Pascal,Algol,C
if E1 then begin if E2 then S1 end else S2
if E1 then if E2 then S1 endif else S2 endif Fortran-77,Ada
if E1 then if E2 then S1 else S2 endif endif
└───就近匹配───┘
嵌套if和case e是同一表达式仅值不同
可改换ease
Ada 的case语句
IF exp1 THEN
ST1
ELSEIF exp2 THEN
ST2
ELSEIF exp...
...
ELSE
SF3
ENDIF
case Exp is switch (exp)
when v1=> S1; case v1: S1;
when v2=> S2; break;
... case v2: S2;
when vm|vn=>Sn; break;
when others => St; default: St;
end case; next;
执行一个Si跳到end case 没有break要顺序执行,直到next
e1
e2
e3
S1
S2
S3
C以条件表达式实现选择控制
a=b<c ? b:c if (b<c) a=b; else a=c;
条件表达式条件语句
命令式语言大量依赖顺序命令, 纯函数式语言完全依赖写嵌套函数调用。
迭代控制
迭代一般用于处理同构的、聚集数据结构的重复操作,诸如数组、表、文件。
显式迭代(循环),显示迭代有以下几种:
无限循环
· 有限循环的三种形式:
while_do
do_until
do_while_do
FORTRAN
初始上界增量
DO L I=EXP1, EXP2, EXP3
Ada
for BACKDAY in reverse DAY 'RANGE loop
在循环控制变量和表达式约定上几十年来一直在演变
C采用迭代元素(Iteration element)
iterate (<控制元素>)<迭代域> = iterate (<a>; <b>; <c>)<迭代域>
对迭代元素不加任何限制。语句,表达式,连续赋值,空均可。先算<a>,再算<b>,若不为零,则算<迭代域>然后执行<c>。若为‘零’出口。若不为‘零’再算<b>,若不为‘零’重复以上步骤,若为‘零’则出循环。
计数循环
例: 用for循环计算表中元素之和
设表list是一简单结构, 一个成分是值value,另一个成分是指向下一表元素的指针next。可以有以下六种写法:
[1] 先赋sum初值进入正规for 循环:
sum=0;
sum += current ->value;
for (curren