4

所以样本循环:

do i=1,1
    print *,i
enddo
print *,i

给我2作为 的最终值i。如何在 Windows 上为 Visual Studio 设置 Intel Fortran 以获得最终值1for i

4

2 回答 2

8

几十年来,这一直是 Fortran 循环的工作方式,您不能简单地使用编译器选项来更改它。Fortran 标准明确规定:

8.1.4.4.1 循环启动

(2) DO 变量被定义为初始参数m 1的值。

(3)迭代次数成立,是表达式的值 MAX (INT ((m2 – m1 + m3) / m3), 0)

这里m 1m 2m 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会增加。12

除了在步骤 (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 中找到几乎相同的文本; 没有WHILEF77 中不存在的东西)以及 ISO/IEC 1539-1:2010(又名 Fortran 2008)的 §8.1.6.6 中的内容。

于 2012-08-09T11:46:11.137 回答
4

你不能,因为这就是 DO 的工作原理;当控制变量超过限制时停止。

一般来说,在几乎任何具有 FOR/DO 计数循环的语言中,您应该只在循环体内使用循环控制变量,并将其视为未定义的其他地方,即使您实际上不能将其范围限制在循环体中。

在您的情况下,我将使用不同的变量来跟踪 i 在任何迭代中的实际最后一个值:

lasti = 0
do i=1,1
   print *,i
   lasti = i
enddo
print *,lasti
于 2012-08-08T23:03:26.547 回答