逻辑运算

优质
小牛编辑
137浏览
2023-12-01

2.2.1关系表达式

a) 关系运算符

关系运算符就是关系比较符。Fortran中有六个关系运算符:

关系运算符

英语含义

所代表的数学符号

.GT.

.GE.

.LT.

.LE.

.EQ.

.NE.

>

>=

<

<=

==

/=

Greater Than

Greater than or Equal to

Less Than

Less than or Equal to

EQual to

Not Equal to

> (大于)

≥ (大于或等于)

< (小于)

≤ (小于或等于)

= (等于)

≠ (不等于)

注意:关系运算符的两个字母(如GT,LE…)的二侧各有一个点,不要漏写。

b) 关系表达式

关系表达式是最简单的一种逻辑表达式。其一般形式为:

<算术表达式> <关系运算符> <算术表达式>

<字符表达式> <关系运算符> <字符表达式>

算术表达式也可以是一个算术量,即为一个数值常数、数值型变量、数值函数。

例:A+B <= 0. A+B .LE. 0. A*B /= C/D A*B .NE. C/D

应当注意,关系表达式中关系操作符只准出现一次。数学中不等式写法与FORTRAN中关系表达式的写法有同有异,在编写关系表一定要严格服从它的一般形式。不可随意使用数学中的习惯用法,例如语句写法 3<X<7 就是不正确的关系表达式,因为它不符合关系表达式中只允许有一个关系操作符的规定。

关系运算的特点是:

* 关系表达式中包括算术运算符和关系运算符,其运算的次序是先进行算术运算,然后进行关系运算。

* 不同类型的数值量进行比较时,系统会先将这两个量转换成同一个类型,然后再比较。转换的规律是将低级类型向高级类型转换。因此,执行关系表达式的过程为:算出算术表达式的值;将两个算术表达式值转换成同一类型;将两个表达式的值进行比较。

* 关系表达式的值不是一个数值,而是一个逻辑量。它的值是“真”和“假”二者之一。

* 由于实数的精度限制,因此用.EQ.(等于)和.NE.(不等于)运算符时要特别注意。要考虑到可能出现的误差,并设法弥补。如对数学式A=B的关系运算可用:ABS(A-B).LT.1.E-30;对A≠B可用:ABS(A-B).GT.1.E-30。

* 除了算术量可进行比较外,字符关系表达式可对两个字符量进行比较。

2.2.2逻辑表达式

a) 逻辑量

Fortran的逻辑常量只有两个:.TRUE. (表示“真”,即满足逻辑条件); .FALSE. (表示“假”,即不满足逻辑条件)。

例:当X=3时,“X<5”的值为.TRUE.(真),而“X<=0.”的值为.FALSE.(假)。

逻辑型变量用来存放逻辑常量。它的值也只能是.TRUE.或.FALSE.之一。可以将一逻辑常量赋予一个逻辑变量。如将A定义为逻辑型变量,用赋值语句对其赋值:

LOGICAL A

A=.TRUE.

逻辑赋值语句的一般形式为:逻辑变量=逻辑表达式。

b) 逻辑运算符

Fortran有5个逻辑运算符,每个操作符两边都有一点,不可省略:

逻辑运算符

含义

逻辑运算例

例子含义

.AND.

.OR.

.NOT.

.EQV.

.NEQV.

逻辑与

逻辑或

逻辑非

逻辑等价

逻辑不等价

A.AND.B

A.OR.B

.NOT.A

A.EQV.B

A.NEQV.B

A,B为真时,则A.AND.B为真

A,B之一为真,则A.OR.B为真

A为真,则.NOT.A为假

A和B值为同一逻辑常量时,A.EQV.B为真

A和B的值为不同的逻辑常量,则A.NEQV.B为真

注意不要将.AND.与.EQV.混淆:A.AND.B是当A和B均为真时才为真;A.EQV.B是当A和B均为真或均为假时为真。

c) 逻辑表达式的运算

下面是逻辑表达式的例子:

逻辑表达式

说明

(A.LT.B).AND.(A.GT.C)

(X.LT.0.).OR.(X.GT.100.)

.NOT.(X.LE.O.)

(A.GT.B).EQV.(C.GT.D)

L1.NEQV.L2

当A<B和A>C时表达式值为真

当X<0或X>100时,表达式值为真

当X≤0时,表达式值为假

当两个括弧内的值都为真或都为假时,表达式的值为真

当L1与L2的逻辑值不相同时,表达式的值为真

一个逻辑表达式中可以包括多个逻辑运算符,如逻辑表达式:A.GE.0.0.AND.A+C.GT.B+D.OR..NOT..TRUE.中不仅有逻辑运算符,还有关系运算符和算术运算符。Fortran规定了以下的运算顺序:

(1)先计算算术表达式的值(例如上式中的A+C和B+D)。

(2)再求关系表达式的值(例如上式中的A.LE.0.0和A+C.GT.B+D)。

(3)最后进行逻辑运算,其顺序是:.NOT. > .AND. > .OR. > .EQV. 和 .NEQV.。如果有括弧,则先进行括弧内的运算。

可用下表表示各种运算符的优先级别:

运算类别

运算符

优先级

括号

( )

1

算术运算

**

2

* /

3

+ -

4

关系运算

.GT. .GE. .LT. .LE. .EQ. .NE.

5

逻辑运算

.NOT.

6

.AND.

7

.OR.

8

.EQV. .NEQV.

9

2.2.3逻辑IF语句

IF语句不是一种选择结构,只是一条语句,它在算法较简单的场合下,可以灵活地完成二分叉选择算法。逻辑IF语句判别逻辑表达式的值是否为“真”,并执行一操作。其一般形式为:IF(逻辑表达式) 执行语句。如果条件成立(即逻辑表达式值是‘真’),则执行其后紧跟的执行语句,而后执行下一条语句;如果条件不成立,则整个IF语句不作任何操作,只是起下滑作用,使控制转移到IF语句的下一个语句。

IF语句最大的用处是退出迭代。计算机程序中经常作连加、连乘或反复执行某段程序,并规定只有当某个参数大于或小于某值时才停止循环,这时就可以使用IF语句。IF语句用于两分叉选择的例子如:求数学中的阶梯函数( ),可写成:

Y=0

IF(X>1) Y=1

注意本例中不可写成:

IF(X<=0) Y=0

Y=1

例:IF(X>0. .AND. K\=N) Y=K+X

例:打印学生考试成绩,大于等于80分的为“A”,大于等于60分而小于80分的为“B”,小于60分的为“C”:

READ *,GRADE

IF(GRADE.GE.8O) PRlNT *,”A”

IF(GRADE.GE.6O .AND. GRADE.LT.80) PRlNT *,”B”

IF(GRADE.LT.6O) PRlNT *,”C”

逻辑IF语句当条件为“真”时只能执行一个执行语句而不能执行若干个语句。与块IF相比,逻辑IF语句是在一行中完成的一个选择操作,因此它又称“行IF语句”以与块IF区别。之所以用逻辑IF语句名称,是沿用了Fortrn66的定义,因为在F66中有两种IF语句:算术IF语句(F90/95中已废除)和逻辑IF语句。

逻辑IF语句也常与GOTO语句合用,但如果过多使用,程序结构将显得混乱,难于理解。应尽可能采用结构化的程序设计方法。[e_223_01.f]