我正在查看用 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),并继续增加......
有人可以给我一个提示吗?
从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 更快。速度并没有快多少,但是编译器人员确实有一个问题,那就可以了。