所以样本循环:
do i=1,1
print *,i
enddo
print *,i
给我2
作为 的最终值i
。如何在 Windows 上为 Visual Studio 设置 Intel Fortran 以获得最终值1
for i
?
所以样本循环:
do i=1,1
print *,i
enddo
print *,i
给我2
作为 的最终值i
。如何在 Windows 上为 Visual Studio 设置 Intel Fortran 以获得最终值1
for i
?
几十年来,这一直是 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是循环控制中的三个参数:[,] var = m1,m2[,m3]
,给定您的示例i=1,1
(如果省略m 3则隐含1
),迭代计数的MAX(INT((1-1+1)/1),0)
计算结果为1
,即循环应该执行一次。根据(2)i
初始化。1
8.1.4.4.2 执行周期
DO 构造的执行周期由以下步骤组成,这些步骤按顺序重复执行,直到终止:
(1) 测试迭代次数,如果有的话。如果迭代计数为零,则循环终止并且 DO 构造变为非活动状态。如果loop-control是
[ , ] WHILE (scalar-logical-expr)
,则评估scalar-logicalexpr;如果此表达式的值为 false,则循环终止并且 DO 构造变为非活动状态。结果,如果所有共享do-term-shared-stmt的 DO 结构都处于非活动状态,则所有这些结构的执行都完成了。但是,如果某些共享do-term-shared-stmt的 DO 结构处于活动状态,则执行将继续执行最近执行 DO 语句的活动 DO 结构的执行周期的步骤 (3)。
Fortran 测试剩余迭代计数是否大于零,而不是 DO 变量是否小于(大于)结束值。
(2) 如果迭代计数不为零,则执行循环的范围。
(3) 迭代计数,如果有的话,减一。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 又名 FORTRAN 77)的 §11.10.3 中找到几乎相同的文本; 没有WHILE
F77 中不存在的东西)以及 ISO/IEC 1539-1:2010(又名 Fortran 2008)的 §8.1.6.6 中的内容。
你不能,因为这就是 DO 的工作原理;当控制变量超过限制时停止。
一般来说,在几乎任何具有 FOR/DO 计数循环的语言中,您应该只在循环体内使用循环控制变量,并将其视为未定义的其他地方,即使您实际上不能将其范围限制在循环体中。
在您的情况下,我将使用不同的变量来跟踪 i 在任何迭代中的实际最后一个值:
lasti = 0
do i=1,1
print *,i
lasti = i
enddo
print *,lasti