为什么Fortran DO循环索引大于循环后的上限?

时间:2012-03-26 22:46:03

标签: loops fortran

我正在查看用fortran编写的空气质量模型的代码,并对fortran从do-loops传递变量的方式有一些疑问。

这个非常简单的例子说明了我的意思:

   PROGRAM carla
   IMPLICIT NONE
   !
   INTEGER, PARAMETER :: LM = 24, DEZASSEIS = 16
   INTEGER            :: L, VARIAVEL, SOMA
   !
   DO L=1,LM
   WRITE(*,*) 'L = ', L
   END DO
   !
   WRITE(*,*) 'I am now ouside of the DO loop.'
   WRITE(*,*) 'I would expect L=LM=24... And SOMA=40'
   WRITE(*,*) 'L = ', L
   SOMA = DEZASSEIS + L
   WRITE(*,*) 'SOMA = ', SOMA
   END PROGRAM carla

我希望L = LM = 24 ...并且SOMA = 40 ...... 但我得到了:

   L =           25
   SOMA =           41

我不明白为什么一旦我们在DO循环之外,L没有保持假设的最后一个值(SOMA将等于40),并且继续增加......

有人可以给我一个提示吗?

2 个答案:

答案 0 :(得分:3)

Fortran不会那样工作。 (这不是Matlab:P)

  

如果在DO循环外使用索引变量,请务必小心   因为变量在循环结束时递增,即它   将比最终值更大的步骤。

http://www.oc.nps.edu/~bird/oc3030_online/fortran/do/do.html

这解释了循环后L=25的原因。

编辑:以下内容不正确。请参阅下面的M.S.B.评论

  

在Fortran中,DO变量...永远不应在循环之外引用,除非先明确赋值。 - http://www.esm.psu.edu/~ajm138/fortranexamples.html

答案 1 :(得分:1)

从1到24循环, 所以当它达到25时,循环就完成了。

Think of it as 
(pseudocode)
LL = 1
While LL < 25
 LL = LL + 1;

正如GummiV所说,不要这样做。循环是编译器优化的主要目标,不能保证循环执行后的内容。可以很容易地为0,一个优化反转计数,因为检测LL = 0比LL更快> 24在一些机器上。不是更快,但编译器人员确实存在问题。