编辑: 星野哀 2019-07-02

第八章 顺序控制 顺序控制提供了操作和数据被组合成程序和程序集合的框架.

涉及两个方面的问题:操作执行顺序的控制(顺序控制)数据在子程序间的传递(数据控制) 执行顺序控制 控制的层次和形式语句内(即表达式)的顺序控制算术表达的顺序控制非算术表达式的顺序控制语句间的顺序控制 8.1 隐式和显式顺序控制 顺序控制结构可分为四组:

1、用于表达式中的结构(也针对语句,表达式是语句的基本建筑块).如:优先级规则和括号.

2、用于语句或语句组间的结构.如:条件和迭代.

3、用于申明式程序设计语言的程序结构.如逻辑程序设计语言

4、用于子程序间的结构,如:子程序调用和协同例程.这种分法并不是精确的,如LISP和APL中只有表达式而无语句.顺序控制结构可以是隐含的(缺省的)(由语言定义,除非程序员显式修改)或显式的(程序员可用来修改隐含顺序). 8.2 算术表达的顺序控制 考虑方程求根:该公式至少涉及15个分开的操作,用汇编或机器语言至少需要15条指令甚至更多.而写成Fortran程序则为:ROOT=(-B+SQRT(B**2-4*A*C))/(2*A)这是自然的表达方法,由翻译器而不是程序员来考虑各种优化问题.然而,翻译器如何控制正确的操作顺序? 算术表达的顺序控制 算术表达式的表示语法:直观表示和形式化表示语义:决定计值方式和过程运算符的优先级算术表达式在执行时的表示 树结构表示 目前,我们将表达式考虑为单个实体,忽略了其计值必需的实际语法和语义.表达式中的基本顺序控制机制是 函数复合 :刻划操作及其操作数.函数复合使表达式呈树结构特征,根为主操作,中间节点为中间层次操作,叶为操作数. 树结构表示 求方程根的表达式的树.树表示阐明了表达式的控制结构,低层的数据引用和操作作为高层操作的操作数,必须先计值,但树表示也留下一些计值顺序没有指定.如:-B和B**2谁先计值?B是否可组合为同一引用?通常语言定义只在树表示级定义表达式计值顺序,允许实现者决定计值细节. 返回 表达式的语法 表达式(a+b)*(c-a)的树结构 表达式的语法 表达式可表示为树结构,但为了在程序中表示,线性化是需要的.前缀(波兰前缀)记法.这是波兰数学家发明的无括号记号法.如:f(x,y,z),*+ab-caLISP使用了该记号法的变种,称为剑桥波兰,用括号将操作符及其操作数括起来,如:(X(+ab)(-ca)).后缀(逆波兰)记号法类似于前缀,但操作符数在后面,如:ab+ca-*中缀记号法最适合二元操作,也是我们最常用的方式. 返回 表达式的语义 (1/3) 上三种记号法对语言的设计都有一些有用的属性,在如何计算表达式值方面也有不同.前缀计值可以通过一遍扫描计值每个表达式,然而需要知道每个操作的操作数量.除了可省去括号外,前缀表达式在语言设计中有如下价值:

1、一般的函数调用均采用前缀方式.

2、可表示有任意数量操作数的操作,写表达式只需一个语法规则.

3、解码可以机械地很容易地进行,将其翻译成简单代码序是容易的. 表达式的语义 (1/3) 前缀计值下面算法用一个执行栈计值表达式:对表达式P,

1、如P中下一项是操作子,压入栈项,设置所需参数数目.

2、如P中下一项是操作数,压入栈项.

3、如栈项n项是操作数(对栈中第一个n元操作),则可以进行计值,用计值结果替代该操作符和操作数. 表达式的语义 (2/3) 后缀计值后缀计值时,操作符紧跟其操作数后而且操作数已被计值.

下载(注:源文件不在本站服务器,都将跳转到源网站下载)
备用下载
发帖评论
相关话题
发布一个新话题