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

car*_*rla 5 fortran loops

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

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

   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
Run Code Online (Sandbox Code Playgroud)

我希望 L=LM=24... 而 SOMA=40... 但我得到:

   L =           25
   SOMA =           41
Run Code Online (Sandbox Code Playgroud)

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

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

Ton*_*son 1

从1到24循环,所以当到达25时,循环结束。

Think of it as 
(pseudocode)
LL = 1
While LL < 25
 LL = LL + 1;
Run Code Online (Sandbox Code Playgroud)

正如 GummiV 所说,不要这样做。循环是编译器优化的主要目标,不能保证循环执行后其中的内容。也可能很容易为 0,一种优化会反转计数,因为在某些机器上检测 LL = 0 比检测 LL > 24 更快。速度并没有快多少,但是编译器人员确实有一个问题,那就可以了。

  • “也可以很容易地为 0”——不,Fortran 的规则指定循环后循环变量的值。还有一个就是编译器错误。 (8认同)
  • @Tony:它不依赖于编译器,除非它有错误。我认为绝对没有理由不在循环之外使用循环变量的值。正如已经说过的,它是明确定义的。其他语言做什么并不重要。 (5认同)