做循环跳过偶数
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
这个特殊问题可能可以通过声明 i
或伪参数 target
.
来解决
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
这个特殊问题可能可以通过声明 i
或伪参数 target
.