Fortran/程序流程控制
条件执行是使用以下结构中的 if、then 和 else 语句完成的
 if (logical_expression1) then
    ! Block of code
 else if (logical_expression2) then
    ! Block of code
 else
    ! Block of code
 end if
您可以根据需要添加任意多个 else if 语句。
在创建表达式时可以使用以下运算符
| 操作 | 现代 Fortran | 旧 FORTRAN | 
|---|---|---|
| 小于 | < | .LT. | 
| 大于 | > | .GT. | 
| 大于/等于 | >= | .GE. | 
| 小于/等于 | <= | .LE. | 
| 等于 | == | .EQ. | 
| 不等于 | /= | .NE. | 
| 逻辑等价 | .EQV. | |
| 逻辑不等价 | .NEQV. | |
| 逻辑非 | .NOT. | |
| 逻辑与 | .AND. | |
| 逻辑或 | .OR. | 
注意:Fortran 标准规定 .EQ. 和 .NEQ. 不能用于逻辑运算,但某些编译器不会强制执行该标准
要检查多个语句,请使用括号。
if ((a .gt. b) .and. .not. (a .lt. c)) then
以下程序生成一个介于 0 到 1 之间的随机数,并测试它是否介于 0 到 0.3 之间、0.3 到 0.6 之间或 0.6 到 1.0 之间。
program xif
    implicit none
    real :: x
    real, parameter :: x1 = 0.3, x2 = 0.6
    call random_seed()
    call random_number(x)
    if (x < x1) then
        print *, x, "<",x1
    else if (x < x2) then
        print *, x, "<", x2
    else
        print *, x, ">=", x2
    end if
end program xif
IF 有两种有趣的过时形式
      IF (<logical_expression>) GOTO <statement_label>
      IF (<arithmetic_expression>) <first_label>, <second_label>, <third_label>
在第一种形式中,事情非常简单。在第二种形式中,将评估算术表达式。如果表达式的值为负数,则执行将在第一个行号处继续。如果表达式的值为零,则执行将在第二个行号处继续。否则,执行将在第三个行号处继续。
- select case(...) case (...); ... end select
如果一个 if 块对单个变量进行重复测试,则可能用 select case 结构替换它。例如,代码
if (month=="January" .or. month=="December") then
    num_days = 31
else if (month=="February") then
    num_days = 28
else if (month=="March") then
    num_days = 31
else
    num_days = 30
end if
可以用以下代码替换
select case (month)
    case ("January", "December")
        num_days = 31
    case ("February")
        num_days = 28
    case ("March")
        num_days = 31
    case default
        num_days = 30
end select
Fortran 不需要 break 语句。
- do i=1,10 ... end do
为了迭代,Fortran 有一个 do 循环。以下循环打印 1 到 10 的整数的平方
do i=1,10
    print *, i**2
end do
可以使用 exit 提前退出循环,如下面的代码所示,它打印整数的平方,直到其中一个平方超过 25。
do i=1,10
    isquare = i**2
    if (isquare > 25) exit
    print *, isquare
end do
循环可以嵌套。以下代码打印 1 到 10 的整数的 2 到 4 次方
do i=1,10
    do ipower=1,3
        print *, i, ipower, i**ipower
    end do
end do
在 DO 的过时形式中,使用循环结束的行号。以下是相同的循环,明确说明 1 标签是每个循环的最后一行
      DO 1 i=1,10
          DO 1 ipower=1,3
              1 PRINT *, i, ipower, i**ipower
如果使用过时形式,循环不能以 IF 或 GO TO 语句结束。可以使用 CONTINUE 语句作为 1 标签的锚点。
在声明 do 循环时还有一个可选的增量参数。以下将以 2 为单位递增。2、4、6、...
do i=2,10,2
    write (*,*) i
end do
do 循环的参数不必是数字,可以是程序中定义的任何整数。first、last 和 increment 可以是任何变量名。
do i=first,last,increment
    ! Code goes here
end do
goto statement_label 将跳转到指定的语句号。
stop exit_code 将以指定的条件代码或退出代码停止。stop 可以不带参数编码。请注意,在许多系统上,stop 0 仍然是失败。另请注意,在 Fortran 2008 之前,条件代码必须是常量表达式,而不是变量。
exit 将退出循环。
continue 可用于在过时的 DO 循环中结束循环,否则将在 IF 上结束。
cycle 将把程序的控制权转移到下一个 end do 语句。
return 将离开子程序或函数。
