“DO”循环在 Fortran 66 中如何工作?

5 fortran

我正在读一本在二手书店找到的旧书(再次)。这一篇叫做《Fortran 技术——特别提到非数值应用》,作者 A. Colin Day,剑桥大学出版社 1972 年出版。 毕竟,跟上软件开发的最新动态是非常重要的; -)

本书声称涵盖 Fortran-66 (X3.9-1966),又名 Fortran-IV,与该标准略有不同DATA此处不相关的语句标准略有不同。

问题是,这本书似乎留下了很多猜测的空间,而我的猜测对于循环来说相当不确定DO。这是第一章中的内容,所以不是一个好兆头。

这是一个例子......

    DO 15 I = 1, 87
    J = I - 44
Run Code Online (Sandbox Code Playgroud)

在该DO行中,1 和 87 似乎表示循环的包含范围 -I取值 1 到 87(包含在内),因此J取值 -43 到 +43(包含在内)。然而,代表什么15

另一个例子是...

    N = 1
    DO 33 I = 1, 10
    ...
33  N = N + N
Run Code Online (Sandbox Code Playgroud)

在本例中,33 看起来像一个标签或行号 - 可能是循环重复(或退出)之前执行的最后一行。但 33 是​​一个奇数,可以选择作为任意标签。

编辑这是一个错误 - 请参阅 duffymo 的答案 - How do `DO` 循环在 Fortran 66 中工作?

之后的下一个例子是......

    DO 33 I = 1, 10
    N = 2 ** (I-1)
Run Code Online (Sandbox Code Playgroud)

再次使用相同的 33,但没有任何行明确地用它标记。

我是否感到困惑,因为这些都是断章取义的简短片段?nin代表什么DO n ...

duf*_*ymo 5

行号告诉代码循环完成后该去哪里。

是的,这些数字是奇数、任意且毫无意义的。这也是 FORTRAN 难以阅读和理解的部分原因。


M. *_* B. 5

这是一个完整的程序,应该可以回答您的一些问题。人们可以很容易地测试这个历史问题...... FORTRAN IV 仍然受到许多编译器的支持,尽管 FORTRAN IV 的某些部分要么正式过时,要么在我看来应该过时。我使用 g77(由于长期不受支持而接近过时)和 gfortran 编译并检查了该程序。

这是一个示例程序:

      implicit none

      integer i
      real q

      q = 1.0
      do i=1, 10
         q = q * 1.5
      end do
      write (6, *) "modern loop: q =", q

      q = 1.0
      do 100 i=1, 10
         q = q * 1.5
  100 continue
      write (6, *) "loop with continue: q =", q

      q = 1.0
      do 200 i=1, 10
  200 q = q * 1.5
      write (6, *) "loop without continue: q =", q

      stop
      end
Run Code Online (Sandbox Code Playgroud)

以及如何使用 gfortran 编译它: gfortran -ffixed-form -ffixed-line-length-none -std=gnu test_loops.for -o test_loops.exe

关于您的问题:如果您使用作为可执行代码的标记行终止循环,那么该行是循环的一部分吗?程序的输出清楚地表明标记的行是循环的一部分。这是 gfortran 的输出:

现代循环:q = 57.665039
带 continue 的循环:q = 57.665039
不带 continue 的循环:q = 57.665039