做循环跳过偶数

Do loop skipping even number

I 代表全局变量即名称 I 代表函数内外相同的变量。当 I = 1 时首先调用 Fact,这是写入的第一个值。这个值是 传递给函数的伪参数N。同样的I现在被Fact内部的DO循环赋予初始值2,但是由于它大于N,所以DO循环没有执行,所以I的值还是2 当在主程序中打印 Fact returns 时。但是,我现在增加到 3 主程序中的 DO 循环,这是它在第二次调用 Fact 时所具有的值。

PROGRAM Factorial 
IMPLICIT NONE 
INTEGER I

DO I = 1, 10 
PRINT*, I, Fact(I) 
END DO

 CONTAINS 
 FUNCTION Fact( N ) 
INTEGER Fact, N, Temp 
Temp = 1 
DO I = 2, N 
  Temp = I * Temp 
END DO 
Fact = Temp 
END FUNCTION 
 END

一旦它完成,我从 2 转到 N,现在 N =3..现在函数必须 returns I =3 到主程序,这样接下来我应该在主程序的 Do 循环中成为 4 , 但是当编译时 运行..它只显示 3,5,7 和 9 的因子.....我的问题是为什么它跳过 4 或 6 或 8.

退出循环后,控制变量的值为上限 + 1。但是,修改循环控制变量的值是非法的,如果您设法这样做,尽管有编译器的检查,但任何事情都可能发生.那么这是一个未定义的行为。


不仅如此,您还通过在函数内部同时将其用作 I 和 N 来为全局 I 设置别名。假设它们是不同的,而实际上它们指的是同一个变量,编译器可能会执行各种优化。因此,该程序再次 非法 且不可预测。

考虑这个例子并尝试用不同的优化级别编译它。你会得到不同的答案:

i = 1
call s(i)

contains

  subroutine s(j)
    do k = 1, 10
      j = i + j
    end do
    print *, j
  end
end

Try it online!

这个特殊问题可能可以通过声明 i 或伪参数 target.

来解决