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

时间:2011-07-29 14:01:06

标签: fortran

我正在读一本我在二手书店里找到的旧书(再次)。这个被称为“Fortran技术 - 特别参考非数字应用”,由A. Colin Day,剑桥大学出版社于1972年出版。毕竟,跟上最新的软件开发是非常重要的。 - )

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

麻烦的是,这本书似乎留下了很多猜测,我的猜测很不确定WR DO循环。这是第1章,所以不是是一个非常好的标志。

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

    DO 15 I = 1, 87
    J = I - 44

DO行中,1和87似乎代表循环的包含范围 - I取值1到87(含),因此J取值-43到+43包括的。但是,15表示什么?

另一个例子是......

    N = 1
    DO 33 I = 1, 10
    ...
33  N = N + N

在这种情况下,33看起来像标签或行号 - 可能是循环重复(或退出)之前执行的最后一行。但33是一个奇数,可以选择任意标签。

编辑这是一个错误 - 请参阅duffymo的答案 - How do `DO` loops work in Fortran 66?

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

    DO 33 I = 1, 10
    N = 2 ** (I-1)

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

我是否感到困惑,因为这些是脱离背景的短片段? n中的DO n ...代表什么?

3 个答案:

答案 0 :(得分:4)

行号告诉代码循环完成时代码的去向。

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

答案 1 :(得分:4)

这是一个完整的程序,可以回答你的一些问题。人们可以很容易地测试这个历史问题...... 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

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

回答你的问题:如果你用一个可执行代码的标记行来终止循环,那么循环的那一行是什么?程序的输出清楚地表明标记的行是循环的一部分。这是gfortran的输出:

现代循环:q = 57.665039
 循环继续:q = 57.665039
 循环没有继续:q = 57.665039

答案 2 :(得分:-2)

15号被称为"标签"它是由程序员决定的。根据组织标准,这些数字受到控制并遵循特定规则。虽然有些程序员没有遵守标准,但他们的代码却很乱;评论和行缩进也是大多数标准的一部分。