I代表全局变量,即名称I代表函数内部和外部的相同变量。当I = 1时,首先调用事实,这是第一个写入的值。这个值是 传递给函数的伪参数N。Fact内的DO循环现在为相同的I赋予了初始值2,但由于它大于N,因此不会执行DO循环,因此我仍然具有值2 当事实返回要在主程序中打印时。但是,我现在在 主程序中的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。现在该函数必须将I = 3返回到主程序,以便下一个在主程序的Do循环中返回4,但是在编译并运行时..它仅显示3、5、7和9的因数。...我的问题是为什么它跳过4或6或8。
答案 0 :(得分:1)
退出循环后,控制变量将获得上限+ 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
可以通过声明i
或伪参数target
来解决此特定问题。