样本循环:
do i=1,1
print *,i
enddo
print *,i
将2
作为i
的最终值。如何在Windows上为Visual Studio设置英特尔Fortran,为1
提供i
的最终值?
答案 0 :(得分:5)
这是Fortran循环工作数十年的方式,你不能简单地用编译器选项来改变它。 Fortran标准明确指出:
8.1.4.4.1循环启动
(2)DO变量用初始参数 m 1 的值定义。
(3)迭代计数已建立,是表达式的值
MAX (INT ((m2 – m1 + m3) / m3), 0)
此处 m 1 , m 2 和 m 3 是 loop-control 中的三个参数:[,] var = m1,m2[,m3]
,给出i=1,1
的示例( m 3 < / em>如果省略则隐式1
)迭代计数为MAX(INT((1-1+1)/1),0)
,其计算结果为1
,即循环应该执行一次。 i
根据(2)初始化为1
。
8.1.4.4.2执行周期
DO构造的执行周期由以下步骤重复执行,直到终止:
(1)测试迭代计数(如果有的话)。如果迭代计数为零,则循环终止并且DO构造变为非活动状态。如果 loop-control 为
[ , ] WHILE (scalar-logical-expr)
,则会评估标量 - 逻辑区域xpr ;如果此表达式的值为false,则循环终止,DO构造变为非活动状态。因此,如果共享 do-term-shared-stmt 的所有DO构造都处于非活动状态,则完成所有这些构造的执行。但是,如果共享 do-term-shared-stmt 的某些DO构造处于活动状态,则继续执行主动DO构造的执行周期的步骤(3),其DO语句最近执行
Fortran测试剩余的迭代次数是否大于零,而不是DO变量小于(大于)结束值。
(2)如果迭代计数非零,则执行循环的范围。
(3)迭代计数(如果有的话)减1。 DO变量(如果有)将增加增量参数 m 3 的值。
当执行循环的迭代时,DO变量总是递增。因此,在第一次执行后i
增加了1
,其评估为2
。
除了在步骤(3)中发生的DO变量的增量之外,DO变量在DO构造处于活动状态时,既不能重新定义也不能变为未定义。
8.1.4.4.4循环终止
当DO构造变为非活动状态时,DO构造的DO变量(如果有的话)保留其最后定义的值。
最后定义的值为2
。因此,在DO循环结束后,i
等于2
。
我已经从ISO / IEC 1539:1991(又名Fortran 90)中删除了文本,但是也可以在ISO / IEC 1539:1980(又名ANSI X3J3 / 90.4)的§11.10.3中找到相同的文本。又称FORTRAN 77;没有F77中不存在的WHILE
内容,以及ISO / IEC 1539-1:2010(又名Fortran 2008)的§8.1.6.6。
答案 1 :(得分:3)
你不能,因为那是DO的工作原理;当控制变量超出限制时停止。
一般来说,在几乎任何带有FOR / DO计数循环的语言中,你应该只在循环体内使用循环控制变量,并在其他地方将其视为未定义,即使你实际上不能将其范围限制为身体。
在你的情况下,我会使用一个不同的变量来跟踪任何迭代中i的实际最后一个值:
lasti = 0
do i=1,1
print *,i
lasti = i
enddo
print *,lasti