流程控制与逻辑运算
目录
IF 语句
编写程序时,应尽量避免分支语句的使用和嵌套
Fortran
if(logical expression) then
statement
end if
IF 语句简略语法(单行),同 C 语言
Fortran
if (logical expression) statement
逻辑运算的优先级高于集合运算的优先级
逻辑运算
逻辑运算 | Fortran 字符缩写 | Fortran 运算符 | C/C++ |
---|---|---|---|
相等 | .EQ. | == | == |
不等 | .NE. | /= | != |
大于 | .GT. | > | > |
小于 | .LT. | < | < |
大于等于 | .GE. | >= | >= |
小于等于 | .LE. | <= | <= |
Fortran 语法没有严格规定是否短路,实际上,Fortran 语言处理短路问题由编译器决定,因而,需要尽量避免写出短路语法
浮点数的逻辑运算
- 计算浮点数逻辑运算时,很少使用
==
来比较大小 - 比较大小时,最好使用相对误差控制,而不是绝对误差控制
Fortran
! if-real.f90
program main
implicit none
real a, b, c, d
a = 3.1415927
b = 3.1415926
c = a * a - b * b
d = c / (a + b)
if (d == a - b) then
print *, "d == a - b"
else
print *, "d != a - b", d - (a - b)
end if
stop
end program main
以下为编译输出过程
bash
$ gfortran -g if-real.f90
(Linux)$ ./a.out
(Windows)$ .\a.exe
d != a - b 6.51454002E-08
集合运算
集合运算 | Fortran 字符缩写 | C/C++ |
---|---|---|
与 | .AND. | && |
或 | .OR. | || |
非 | .NOT. | ! |
结果相同,同或 | .EQV. | ^ |
结果不同,异或 | .NEQV. | !^ |
集合运算的优先级规则:.not.
> .and.
> .or.
> .NEQV
= .EQV.
Fortran
! if.f90
program main
implicit none
integer :: a = 2, b = 13
if (a > b .and. a * b > 30 .or. a + b > 13) then
print *, '1'
end if
if (a + b > 13 .or. a * b > 30 .and. a > b) then
print *, '2'
end if
stop
end program main
以下为编译输出过程
bash
$ gfortran -g if.f90
(Linux)$ ./a.out
(Windows)$ .\a.exe
1
2
// TODO
多重逻辑判断:IF - ELSE IF
编写程序时,应尽量避免分支语句的使用和嵌套。选用多重逻辑判断时,应尽量把执行概率高的分支放到前面
Fortran
if (logical expression) then
statement
else if (logical expression) then
statement
else if (logical expression) then
statement
else
! when all the logical expression is false
statement
end if
嵌套 IF 语句
Fortran
if (logical expression) then
statement
if (logical expression) then
statement
else
statement
end if
end if
SELECT CASE 语句
Fortran
select case(value)
case (value1)
statement
case (value2)
statement
case default
! when there is no option matching the value
statement
end select
当变量是整数时,指定数值时可以使用冒号来指定范围,数值必须是常数而非变量
Fortran
select case(value)
case (:10)
statement
case (11:20)
statement
case (20:)
statement
case default
! when there is no option matching the value
statement
end select
GOTO 语句与其他语句
goto
语句:用于无条件跳转到指定的标签处,标签是一个整数,可以是任意整数,但不能是变量pause
语句:用于暂停程序的运行,等待用户按回车键继续运行continue
语句:用于跳过当前循环的剩余部分,继续执行下一次循环stop
语句:用于终止程序的运行,可在 stop 时输出信息,可用于断点调试
stop 语句最为常用,其次是 continue 语句,pause 语句很少使用,goto 语句几乎不用
其中,stop 语句可以接受一个数字或者字符串参数(常数),用于输出信息,便于调试,不过在低版本编译器上可能会导致错误。
Fortran
program main
implicit none
integer :: i
do i = 1, 10
if (i == 5) then
stop 1
! or stop 'error'
end if
end do
end program main