循环跳过偶数

时间:2019-05-24 06:29:30

标签: fortran gfortran

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。

1 个答案:

答案 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

Try it online!

可以通过声明i或伪参数target来解决此特定问题。