




已阅读5页,还剩28页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第8章 构造表达式完成了数据描述的任务之后,一个程序就进入了数据处理的阶段。也就是一系列的以数据为对象的操作语句,访问经过声明的数据对象,施加计算处理之后,获得新的数据结果。FORTRAN语言里面访问数据对象然后返回值的一个基本指令形式是表达式,而通过表达式所得到的计算结果被用来赋值给某个变量,完成这个操作的是赋值语句。本章与下一章我们将讨论表达式与赋值语句这两个相续的改变机器的数据状态的基本操作。一个科学计算程序的基本任务就是进行计算,而计算的最基本的单位就是表达式。FORTRAN作为一门最早的高级语言,其初衷就是公式翻译(FORMULA TRANSLATION),即希望运用这个语言,能够把数学公式最好是原封不动地搬到FORTRAN语言的环境里,而计算机能够忠实地理解公式的含义,并进行公式所要求的运算。当然,要求把能够把数学公式原封不动地搬到FORTRAN语言的环境里,就能够被FORTRAN理解是不可能的,因为首先是公式的输入受到键盘的限制,然后作为一种程序语言,我们在第4章已经讨论过,它所使用的字符集必定是有限的,而数学符号的集合则基本上是开放性的。而从计算的实质上来考虑,我们知道计算机在物理层面所能够做到的计算其实是非常简单的加减法而已,因此我们希望运用计算机来完成任意的计算任务,所面临的挑战,正是如何把我们的实际计算任务分解为等价的简单计算过程的组合,FORTRAN作为一种语言,显然只能在很初步的层次上完成这个任务,即直接在语言里使用数学基本运算,例如:加法,减法,乘法,幂运算等,然后在此基础上,再定义一些基本的数学函数作为语言的固有函数,可以供人直接引用,对它的解释则完全交给FORTRAN编译器。FORTRAN所能够做到的基本上也就到此为止了。更进一步的计算的分解任务,则必须由程序来完成。因此FORTRAN能够做到的就是尽量以符合数学的书写习惯的方式来规范表达式的格式。一般说来,我们把表达式理解为语句(甚至是程序)的语法结构的单位。在其他的语言里,表达式同样具有非常关键的语法地位,例如在C语言中,表达式组成了允许每一语句改变机器状态的基本操作。在LISP语言这样的高级应用语言中,表达式构成了驱动程序执行的基本顺序控制。而在FORTRAN这样的以科学计算为主要目的的语言当中,表达式更是构成了完成计算任务的基本成分。本章的讨论就是围绕着表达式的构造如何贴切地合乎我们对于计算任务的要求。分为三个部分: 有效合法的表达式的格式。也就是构造表达式的语法。按照我们在前面经常根据语法规则来构造语言所获得的经验,合乎格式的语句不一定是有实际意义的语句,因此我们接着就需要讨论对表达式的理解问题,即: 对表达式的解释。可以理解为表达式的语义,也就是一种规范,按照这种规范,计算机读入合法的表达式之后,能够无歧义地转化为一系列指令,从而采取相应的动作。计算机对表达式的含义的理解建立在表达式的构造语法的规范性上,一旦完成这个步骤,接着就是完成表达式的最终任务: 表达式的计算过程。计算机对于表达式的实际计算过程未必与人的计算过程一致,对于计算机来说,最为重要的是根据机器计算的特点,对计算过程进行优化,相应的作为程序作者,我们需要了解机器的优化原则,以便在程序写作与算法设计上配合机器的计算优化能力。FORTRAN表达式的构造,需要解决两大问题: 构造算元与算符的规则; 运算优先级的规则。在构造合法的FORTRAN表达式的过程中,最主要的问题就是如何在FORTRAN有限的构造表达式的规则下,能够构造具有开放性的数学公式。由于一个表达式的基本成分就是算元,算符和括号,因此上面的问题可以分为两个部分:在固有算元类型的基础上,能够构造派生类型的算元;在固有算符的基础上,能够扩展固有算符的适用范围,能够构造派生类型的算符。因此所谓构造表达式的规则,除了规定固有算元与固有算符之外,还必须给出对固有算元与固有算符的扩展与派生定义的规则。接下来需要考虑的问题,就是如何表达运算优先级,也就是括号所具有的功能。在数学运算的过程当中,运算优先级是一个很自然的问题,在数学公式的写作中,我们使用了很多隐含的规则,基本能够保证数学公式的读者不会产生歧义,把数学公式转换到FORTRAN语言当中,就不能够再依靠那些隐含的规则,而是需要把那些规则明确的形式化出来,有时候还得制定适应于机器语言的独特规则。尽管我们可以使用尽可能多的括号来做到明确的优先级描述,但是从方便写作的角度来看,在不导致歧义的前提下,可以通过形式规则来省略很多括号。8.1 表达式的构造本节可以说是书写表达式的语法。从语言的角度来看,我们前面章节所讨论的数据对象,可以说是语言的词汇,而且是语法意义上比较简单词汇,即使很多数据对象可以具有非常复杂的数据结构,但在语法意义上,则仍然可以看成是单词。但表达式就不同了,它所隐含的指令性质使得它可以看成是复合性质的词汇。实际上表达式是访问程序中的数据对象并返回值的函数。这就要求它具有比数据对象更为复杂的语法结构。表达式包含三个基本成分: 算元; 算符; 括号。其中算元具有最基本的实质含义,因此最简单的表达式就是一个常量,或一个变量。【例8-1】 下面的例子都可以看成是最简单的表达式:2.7183 !一个实型常数A !一个标量变量X !一个数组变量.TURE. !一个逻辑型常量X(I) !作为数组X的元素的变量X(10:100:5) !作为一个数组片断的变量A%B !作为结构A的成员的变量X(I)(K:K+100) !作为数组元素X(I)的子串的变量8.1.1 算元遵循变量的数学精神,我们可以把表达式看成是一个递归结构,即表达式里的变量总是可以代表任意的由变量构成的结构,或者说表达式,因此可以如下规定算元的构成。一个算元可以是如下形式的表达式: 一个常量或常量的子对象; 一个变量; 一个数组构造器; 一个结构构造器; 一个函数引用; 另一个括号里的表达式。注意另一个表达式!,如果使用同一个表达式,必然导致死循环。【例8-2】 下面是算元的例子:X !Y(3)Z(10:100)(X+SIN(Y)(/5.52,4031/)EULER(5,9)RT8.1.2 一元算符与二元算符根据算符所作用的算元数目,算符分为一元算符与二元算符。下面的表8-1给出了FORTRAN的固有算符,除此之外,用户可以运用函数子程序来给出自定义算符,然后使用一个名称来标志该自定义算符,在FORTRAN语言里,则还需要在名称的两边分别加上一个句点,以便FORTRAN辨识为自定义算符。无论是固有算符还是自定义算符,总是分为一元算符与二元算符。一元算符作用于一个算元,形式为: operator x即算符写在算元之前。【例8-3】 + A - G .NOT. B上面的一元算符里面,+和-都可以成为二元算符,而.NOT.则是唯一的只能作一元算符的固有算符。加号+运算实际上并不影响算元的值。二元算符作用于2个算元,形式为: x operator y即算符写在2个算元之间。【例8-4】 A+B D*3 X .AND. Y A .GT. B C .NE. D PROGRAMER / CALCULATE A = B C-D8.1.3 固有算符与自定义算符算符分为两类: 固有算符。所谓固有算符就是直接使用相应符号,能够被FORTRAN编译器所辨识的算符。下面的表8-1给出了FORTRAN的固有算符以及相应的算元类型。表8-1 FORTRAN的固有算符以及相应的算元类型算符类别固有算符算元类型算术运算+,-(一元算符)*,*,/,+,-(二元算符)任意数值类型与任意种别参数的数值的组合字符运算/具有相同种别参数的任意长度的字符串关系运算.EQ.,.NE.,=,/=两个算元或者同时是任意数值类型与任意种别参数的数值,或者同时是具有相同种别参数的任意长度的字符串关系运算.GT.,.GE.,.LT.,.LE.,=,=,=,=在任何情况下总是分别等价于.EQ.,.NE.,.GT.,.GE.,.LT.,.LE.。注意关系表达式的定义不具有递归性,即关系表达式本身不出现在上面的形式定义当中,所以不会出现多个关系算符连在一起的情形。【例8-11】X .NE. Y关系表达式X =Y关系表达式X/Y关系表达式X+Y加法表达式也是关系表达式-X关系表达式X / Y / Z关系表达式X*Y幂运算表达式也是关系表达式.ABEL.G自定义一元表达式也是关系表达式G单独的基元也可以构成关系表达式8. 非运算表达式非运算表达式的算元为.NOT.,是一元算符,句法形式(R715)为: .NOT. comparision-expression 注意非运算表达式的定义不具有递归性,即非运算表达式本身不出现在上面的形式定义当中,所以不会出现多个算符.NOT.连在一起的情形。【例8-12】.NOT. X非运算表达式X .NE. Y关系表达式也是非运算表达式X =Y非运算表达式X/Y非运算表达式X+Y加法表达式也是非运算表达式X / Y / Z非运算表达式X*Y幂运算表达式也是非运算表达式.ABEL.G自定义一元表达式也是非运算表达式G单独的基元也可以构成非运算表达式9. 与运算表达式与运算表达式的算元为.AND.,是二元算符,句法形式(R716)为: conjunct-expression .NOT. not-expression 注意与运算表达式的定义具有左边递归性,即与运算表达式本身出现在上面的形式定义当中,所以会出现多个算符.AND.连在一起的情形,这时的优先顺序是从左到右。即X .AND. Y.AND. Z的优先顺序是(X .AND. Y).AND. Z。【例8-13】X .AND. Y与运算表达式X .AND. Y.AND. Z优先顺序是从左到右的与运算表达式.NOT. X非运算表达式也是与运算表达式X .NE. Y关系表达式也是与运算表达式X =Y与运算表达式X/Y与运算表达式X+Y加法表达式也是与运算表达式X / Y / Z与运算表达式X*Y幂运算表达式也是与运算表达式.ABEL.G自定义一元表达式也是与运算表达式G单独的基元也可以构成与运算表达式10. 或运算表达式或运算表达式的算元为.OR.,是二元算符,句法形式(R717)为: disjunct-expression .OR. conjunct -expression 注意或运算表达式的定义具有左边递归性,即或运算表达式本身出现在上面的式定义当中,所以会出现多个算符.OR.连在一起的情形,这时的优先顺序是从左到右。即X.OR. Y.OR. Z的优先顺序是(X.OR. Y).OR. Z。【例8-14】X.OR. Y或运算表达式X.OR. Y.OR. Z优先顺序是从左到右的或运算表达式X .AND. Y与运算表达式也是或运算表达式.NOT. X非运算表达式也是或运算表达式X .NE. Y关系表达式也是或运算表达式X =Y或运算表达式X/Y或运算表达式X+Y加法表达式也是或运算表达式X / Y / Z或运算表达式X*Y幂运算表达式也是或运算表达式.ABEL.G自定义一元表达式也是或运算表达式G单独的基元也可以构成或运算表达式11. 等价运算表达式等价运算表达式的算元为.EQV.或者是.NEQV.,是二元算符,句法形式(R718)为: equivalence-expression .EQV. disjunct -expression equivalence-expression .NEQV. disjunct expression注意等价运算表达式的定义具有左边递归性,即等价运算表达式本身出现在上面的形式定义当中,所以会出现多个算符.EQV. 或与.NEQV.连在一起的情形,这时的优先顺序是从左到右。即X.NEQV. Y.EQV. Z的优先顺序是(X.NEQV. Y).EQV. Z。【例8-15】Y.EQV. Z等价运算表达式X.NEQV. Y等价运算表达式X.NEQV. Y.EQV. Z优先顺序是从左到右的等价运算表达式X.OR. Y或运算表达式也是等价运算表达式X .AND. Y与运算表达式也是等价运算表达式.NOT. X非运算表达式也是等价运算表达式X .NE. Y关系表达式也是等价运算表达式X =Y等价运算表达式X/Y等价运算表达式X+Y加法表达式也是等价运算表达式X / Y / Z等价运算表达式X*Y幂运算表达式也是等价运算表达式.ABEL.G自定义一元表达式也是等价运算表达式G单独的基元也可以构成等价运算表达式12. 表达式最一般的表达式的句法形式(R723)为: expression defined-operator equivalence-expression 注意表达式(expression)的定义具有左边递归性,即表达式本身出现在上面的形式定义当中,所以会出现多个相同优先级的算符连在一起的情形,这时的优先顺序是从左到右。【例8-16】X .CROSS. Y表达式X .CROSS. Y .CROSS. Z优先顺序是从左到右的表达式Y.EQV. Z等价运算表达式也是表达式X.NEQV. Y等价运算表达式也是表达式X.NEQV. Y.EQV. Z等价运算表达式也是表达式X.OR. Y或运算表达式也是表达式X .AND. Y与运算表达式也是表达式.NOT. X非运算表达式也是表达式X .NE. Y关系表达式也是表达式X =Y表达式X/Y表达式X+Y加法表达式也是表达式X / Y / Z表达式X*Y幂运算表达式也是表达式.ABEL.G自定义一元表达式也是表达式G单独的基元也可以构成表达式13. 表达式形式的层次上面我们已经完备地给出了表达式的语法形式,可以明显地看到从最简单的表达式到更为复杂的表达式,具有一种层次结构,这种依据优先级顺序给出的层次结构是我们构造复杂表达式所必须遵循的规则,也是计算机理解表达式时所依据的规则。下面我们给出总结。【例8-17】下面是一个表达式里的运算优先级降低的例子: X !基元 .INVERSE. X !自定义一元运算 X*Y !幂运算表达式 X*Y !乘法运算表达式 -X !加法运算表达式 X/Y !连接运算表达式 X .EQ. Y !比较运算表达式 .NOT. X !非运算表达式 X .AND. Y !并运算表达式 X .OR. Y !或运算表达式 X .EQV. Y !等价运算表达式 X .CROSS. Y !一般表达式下表8-2给出各种一般形式的表达式的运算优先级:表8-2一般形式的表达式的运算优先级优先级向下递降的运算项运算的定义优先级基元常量常量子对象变量数组构造器函数引用(表达式)高自定义一元运算表达式自定义算符运算元幂运算表达式自定义一元运算表达式*幂运算表达式乘法运算表达式乘法运算表达式*幂运算表达式乘法运算表达式 /幂运算表达式加法运算表达式加法运算表达式+乘法运算表达式加法运算表达式 - 乘法运算表达式+ 加法运算表达式- 加法运算表达式连接运算表达式连接运算表达式 /加法运算表达式比较运算表达式比较运算表达式关系算符 比较运算表达式非运算表达式.NOT. 比较运算表达式并运算表达式并运算表达式 .AND. 非运算表达式或运算表达式或运算表达式 .OR. 并运算表达式等价运算表达式等价运算表达式 .EQV. 或运算表达式等价运算表达式 .NEQV. 或运算表达式一般表达式表达式自定义算符 等价运算表达式低8.2.5 算符的优先级顺序下表8-3给出各类算符在同样的优先级的情形下的运算优先级顺序:表8-3各类算符在同样的优先级的情形下的运算优先级顺序算符类型算符同优先级下的运算顺序优先级自定义一元自定义算符无最高数值运算*右到左数值运算*或 /左到右数值运算一元算符+或-无数值运算二元算符+或-左到右字符运算/左到右关系运算.EQ.,.NE.,.LT.,.LE.,.GT.,.GE.,=,/=,=无逻辑运算.NOT.无逻辑运算.AND.左到右逻辑运算.OR.左到右逻辑运算.EQV.或.NEQV.左到右自定义二元自定义算符左到右最低 表8-3自定义一元算符在所有算符与所有同优先级算符当中,具有最高的优先级。而自定义二元算符在所有算符与所有同优先级算符当中,具有最低的优先级。表中的“无”表示该算符不会连续出现,可以看到具有这个特点的是自定义一元算符,关系算符,和逻辑非算符,它们的优先级顺序只能使用括号来说明。8.2.6 固有运算固有运算的完整含义是,除了算符是属于固有算符,因此可以直接使用相应符号而不需要预先说明之外,算符所作用的算元也必须属于固有数据类型。不同的算符所能够作用的算元类型是不同的。下表8-4给出了不同的算符所能够作用的算元类型:表8-4 不同的算符所能够作用的算元类型固有算符算元1的类型算元2的类型计算结果的类型一元算符+,-I,R,ZI,R,Z二元算符+,-,*,/,*IRZI,R,ZI,R,ZI,R,ZI,R,ZR,R,ZZ,Z,Z串联算符/CCC.EQ.,.NE.,=,/=IRZCI,R,ZI,R,ZI,R,ZCL,L,LL,L,LL,L,LL.LT.,.LE.,.GT.,.GE.,=,/=,=IRCI,RI,RCL,LL,LL.NOT.LL.AND.,.OR.,.EQV.,NEQV.LLL 表中I表示整型,R表示实型,Z表示复型,C表示字符型,L表示逻辑型。8.2.7 自定义运算自定义运算的完整含义是: 如果算符形式上是固有算符,那么它的算元必定不属于表8-3里面所规定的类型; 所含有的算符为自定义算符。自定义运算的一般句法形式(R703,R723)为: intrinsic-unary-operator y defined-operator y x intrinsic-binary-operator y x defined-operator y其中自定义算符(defined-operator)需要在一个具有通用标识符OPERATOR的界面块里用一个函数子程序来加以单独的解释与计算。如果自定义运算使用了固有算符的符号,意味着扩展了其中固有算符所作用的算元的类型范围,它的通用性需要在界面块里说明。如果自定义运算使用了自定义算符,那么该自定义运算被称为扩展运算,所使用的自定义算符称为扩展算符。8.2.8 表达式的数据类型,种别参数和形状作为表达式的计算结果,可以说表达式终究是有它的数据类型,种别参数,以及形状这些数据对象所具有的属性,那么表达式的这些属性终究是由它的基元的数据属性决定的。由基元的数据属性最终得到表达式的数据属性,这中间需要完成全部的运算,每经过一次运算,结果的数据属性都可能随着新的算元的加入而发生改变,唯一可以确认的是运算的顺序,是严格按照算符的优先级顺序进行的,鉴于基元本身的可能的数据属性的多样化,下面分小节讨论表达式的的数据属性。1. 基元的数据类型以及种别参数基元的数据属性如果已经直截了当地在声明语句当中给予了说明,那就不是我们在这里讨论的中心。【例8-18】INTEGER I(100,20)REAL (8.5,6,4.4)它们的数据属性已经显式地给出。下面我们要讨论的基元类型是: 指针; 数组构造器; 结构构造器; 函数。指针变量的类型,种别参数和秩都会在指针变量的声明语句当中予以说明。但是当指针为待定形数组时,它的形状就是由它的目标来决定。【例8-19】 INTEGER,POINTER:X(:,:) INTEGER,TARGET:Y(100,200)其中X的形状就是由Y决定的,即(100,200)。如果对指针使用固有函数NULL,那么它会返回一个非关联指针,而非关联指针没有形状,但是有秩。当NULL()不带变量时,固有函数NULL返回的结果的类型,种别和秩由与结果关联的指针决定,跟NULL出现的场合有关,详见下表8-5:表8-5固有函数NULL返回的结果NULL()出现的场合决定结果的类型,种别参数和秩的对象指针赋值语句的右边左边的对象声明语句当中一个对象的初始化该对象一个成员的默认初始化该成员结构构造器相应的成员实元相应的哑元DATA语句相应的对象 【例8-20】 下面是NULL后接变量的例子: INTERFACE ADD SUBROUTING S1(J,PI) INTEGER J INTEGER,POINTER:PI END SUBROUTING S1 SUBROUTING S2(K,PR) INTEGER K REAL,POINTER:PR END SUBROUTING S2 END INTERFACE REAL,POINTER:REAL_KER CALL ADD(10, NULL(REAL_KER) 数组构造器的类型,种别和形状由构造器的形式决定。它的秩为1,而尺度等于其中元素的个数,它的类型和种别与其中任意一个元素的一致,因为它的所有元素的类型和种别都必定是相同的。【例8-21】 给出一个构造器:(/2.4_2, 5.9_1, 9.4_1, 6.4_1)为实型,种别参数为2,尺度为4.结构构造器的类型就是派生类型的类型名称,一个结构构造器总是标量,而结构不具有种别参数。【例8-22】 给出下面的结构构造器: SAMPLE(5.0, “ALPHA”)它的类型就是SAMPLE.函数的类型,种别和形状的决定有以下几种情形: 在引用函数的程序单位里对函数进行了隐式声明; 在引用函数的程序单位里对函数进行了显式声明; 函数具有显式界面(如果界面不是显式的,那么函数或者是外部函数,或者是语句函数)。如果界面是显式的,属性的决定有如下几种情形: 引用函数的程序单位里的界面块里,有对函数的类型声明以及其他说明语句; 对内部过程或模块过程的类型声明以及其他说明语句说明了函数; 被引用的特定的固有函数的描述。注意,由于固有函数和带界面块的函数可能是通用的,因此它们的属性由特定函数引用的实元决定。【例8-23】 REAL FUNCTION FUN(A) DIMENSION FUN(20,50)上面的语句是给出了内部函数FUN的程序单位的一部分,那么要引用函数FUN(8.1),它的类型就是默认实型,形状为(20,50)。【例8-24】 REAL(DOUBLE)A(30,50) COS(A)函数COS的界面在固有函数COS的定义里给出,这里引用的函数COS(A)为双精度实型,形状为(30,50)。当函数是外部函数或为语句函数时,界面就是隐式的,这时形状总是标量,而其他属性则由默认隐式类型声明所规定,或者是由语句函数的显式声明决定。【例8-25】 IMPLICIT REAL (SINGLE)(A) FUN(X)其中的FUN(X)就是一个单精度实型标量。如果变量或函数是属于待定形或哑形数组,会有以下几种情形: 对于待定形数组,它的秩已经被声明,但是它的每个维度的尺度需要在运行ALLOCATE语句或指针赋值语句之后才能确定。 对于哑形数组,它的秩已经被声明,但是它的形状需要子程序运行之后给出。 对于指针来说,则需要由被关联到指针的目标来确定形状。因此一般说来待定形或哑形数组,只能在运行时间才能确定形状。2. 运算结果的类型与种别参数对固有类型算元进行固有算符的运算的结果的类型,已经在表8-3给出,因此现在只需要讨论决定种别参数的规则。运算分为两类: 非数值运算。 数值运算。对于非数值运算有如下情形: 固有关系运算:种别参数为默认逻辑型。 固有逻辑运算:如果算元具有相同的种别参数,则结果与之保持一致;如果算元具有不同的种别参数,则由编译器决定。 固有字符运算: 算元与结果的种别参数必定保持一致,长度参数则是两个算元的长度的和。对于数值运算,有如下情形: 一元运算:保持算元的种别参数不变。 二元运算:两个算元如果是不同数据类型,则按照表8-3决定;两个算元如果是相同数据类型与种别参数,则结果保持不变;如果两个算元都是整型,种别参数不同,那么结果取幂次范围大的,如果幂次范围一样大,则由编译器决定;如果两个算元都是实型或复型,种别参数不同,那么结果取精度大的,如果精度一样大,则由编译器决定。 对于二元数值运算,基本的规则可以理解为:如果把从整数到最高精度的复数按照集合包含关系排列起来,那么只要两个算元的种别参数不同,结果总是取所属集合更大的算元的种别参数。上面讨论的是针对固有类型数据的固有运算,对于自定义运算,结果的类型以及种别参数由被引用的运算的界面块给出,也即在界面块里说明的作为自定义运算的函数名的类型以及种别参数。【例8-26】 INTERFACE OPERATOR(.PLUS.) TYPE(SET)FCN_SET_PLUS(X, Y) TYPE(SET), INTENT(IN):X,Y END FUNCTION FCN_SET_PLUS TYPE(ADD) FCN_SET_PLUS(X, Y) TYPE(ADD) , INTENT(IN):X,Y END FUNCTION FCN_SET_PLUS END INTERFACE在得到上面的算符定义之后,如果取类型SET的对象A和B,那么表达式A.PLUS.B的类型也为SET,无种别参数;如果取类型ADD的对象A和B,那么表达式A.PLUS.B的类型也为ADD,无种别参数。3. 表达式的形状 表达式形状的决定同样是从基元开始,按照算符的优先级顺序,逐步从底层到高层而决定的。但是形状的决定比类型与种别参数的决定要简单,因为二元运算的2个算元的形状要求具有一定的关系: 二元固有运算的2个算元必须保证形状的一致性,也就是两个算元或者是相同形状的数组,或者至少有一个算元是标量。 对于二元自定义运算,则2个算元或者与定义的函数的相应哑元保持一致,或者相互也保持一致。其结果的形状自然也保持不变。因此结果的形状的决定也就相应比较简单了。 一元运算不改变算元的形状。 如果基元是常量,变量,构造器,或函数,则结果的形状分别就是常量,变量,构造器,或函数名称。 如果基元是对固有函数NULL的引用,那么结果的形状就与基元无关。而由被关联到结果的指针决定。 结构构造器总是标量。 数组构造器总是秩为1,尺度等于元素数目的数组。 二元固有运算的算元只要有一个是数组,结果就是相应的数组,否则就是标量。 对于自定义运算来说,如果算元的形状与哑元保持一致,结果的形状就是定义运算的函数名称,或者如果定义的函数是基元性的,则结果的形状就是数组算元的形状。【例8-27】 INTERFACE OPERATOR(/) FUNCTION FCN_CONCAT(A,B) CHARACTER (*,1) A CHARACTER (*,2) B CHARACTER (LEN(A)+LEN(B),2) FCN_CONCAT (SIZE(B) END FUNCTION FCN_CONCAT END INTERFACE设X是种别参数为1,长度为30的字符型标量,Y是种别参数为2,长度为50的字符型数组,其形状为(25)。那么考虑X/Y的属性:由于算符/的界面里的FCN_CONCAT的类型声明就决定了表达式X/Y的结果为种别参数2的字符型,结果的长度为2个算元的长度之和,即80,结果的形状是秩为1,而尺度等于相应于哑元B的实元Y的尺度,也就是形状为(25)。4. 表达式的宽度在大多数情形下,数组表达式的宽度并不需要特别的考虑,因为一致性的要求只涉及到每个维度的尺度。不过如果数组表达式是固有函数LBOUND和UBOUND的ARRAY变量的,数组表达式的宽度就需要加以考虑了。固有函数LBOUND和UBOUND含有两个关键词变量: ARRAY,为数组表达式。 可选的DIM,为整型表达式。如果变量DIM给出的话,那么函数LBOUND和UBOUND就分别返回由变量DIM决定的维度的下界与上界。如果变量DIM不给出的话,那么函数LBOUND和UBOUND就分别返回由变量ARRAY决定的所有维度的下界与上界组成的秩为1的数组。8.2.9 特殊表达式表达式除了用于赋值语句之外,还可能出现在许多特殊的场合,在那些特殊场合里的表达式是受到了各种限制的,比如: 出现在PARAMETER语句当中的表达式就被限制为常量表达式,起到初始化的作用。这类表达式称为常量表达式; 在许多说明语句当中,充当数组界或者是字符长度值的也可能是一些整型表达式,它们在程序单位运行的时候,就会执行计算过程,给出数组界的值或字符长度值。这类表达式称为说明表达式。本节我们就是分小节讨论这2类特殊的表达式的特殊用途。1. 常量表达式常量表达式就是扩展常量或扩展常量通过固有算符构成的表达式。所谓扩展常量的含义有如下几种情形: 字面常量,命名常量,常量子对象,其中子对象的每个下标,或片断下标,或子串范围的始点与终点都是常量表达式。 一个数组构造器,它的每个子表达式的基元都是常量表达式,或者是数组构造器的隐式do变量。 每个成员都是常量表达式的结构构造器。 在汇编时被计算的固有函数引用。 括号里的常量表达式。要求固有函数引用在汇编时被计算,就排除了使用固有函数PRESENT,ASSOCIATED和ALLOCATED,并且要求函数引用的每个变量都是常量,或者至少在编译时,变量的种别参数与界已知。例如在所有维度具有显式界的数组A,对于A的查询函数SIZE(A)在编译时是可以计算的,那么SIZE(A)*3就是一个常量表达式,可以作为扩展常量。这样一个限制就排除了属于
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 七年级历史下册 第二单元 辽宋夏金元时期 民族关系发展和社会变化 第9课 宋代经济的发展教学设计 新人教版
- 早教报名协议书8篇
- 七年级语文上册 9从百草园到三味书屋第3课时教学设计 新人教版
- 电子商务发展动态
- 车辆安全隐患课件
- Unit6 Section A Grammar Focus3a-3d 教学设计 2024-2025学年人教版英语七年级上册
- 七年级体育与健康 基本体操2教学设计
- 直肠肛管疾病护理
- Unit 8 How are you (教学设计)-2023-2024学年译林版(三起)英语四年级下册
- 耳科手术一般护理
- 2025重庆西南证券股份有限公司招聘45人笔试参考题库附带答案详解
- 2025年4月自考15043中国近现代史纲要押题及答案
- 湖南省示范性高中2024-2025学年高二下学期2月联考 物理试卷(含解析)
- 服装公司品质(质量)管理手册
- 江苏省淮安市洪泽区2024-2025学年七年级下学期3月调研地理试题(含答案)
- 办公楼弱电系统设计方案
- 黄金卷02(广州专用)-【赢在中考·黄金预测卷】2025年中考数学模拟卷(考试版)
- 2025-2030年班用帐篷项目投资价值分析报告
- 2025年国家粮食和物资储备局垂直管理系统事业单位招聘701人历年自考难、易点模拟试卷(共500题附带答案详解)
- 2025年合肥二模数学试题及答案
- 2024-2025年全国初中化学竞赛试卷及答案
评论
0/150
提交评论