Skip to content

流程控制与逻辑运算

目录

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

基于 CC BY-NC-SA 4.0 许可发布