Fortran DO循环结束后的索引值是多少?

5

请问DO循环的工作原理是什么?

假设您有以下循环:

do i=1,10
...code...
end do

write(*,*)I

为什么打印的I是11而不是10?

但当循环由于一个

if(something) exit

如果 i 的取值符合预期(例如 i=7),则退出循环,因为某些其他值达到了其限制。


抱歉,没有找到那个问题。我的问题是重复的。谢谢提示。 - why.n0t
1
请参阅Fortran 2008标准的第8.1.6.6.2和8.1.6.6.4节。后者指出:“当DO结构变为非活动状态时,DO结构中的DO变量(如果有)将保留其上次定义的值。”而前者则详细说明了循环迭代。 - user1220978
2个回答

7

i的值在do循环之前变成了11,这是因为条件判断语句中的结束条件在1..10范围内都成立,当i变成11时,结束条件不再成立,循环终止。因此,循环结束时,i的值为11

伪代码形式如下:

1) i <- 1
2) if i > 10 goto 6
3) ...code...
4) i <- i + 1
5) goto 2
6) print i

当到达第6步时,i的值为11。当你放入你的if语句时,它变成了:

1) i <- 1
2) if i > 10 goto 7
3) ...code...
4) if i = 7 goto 7
5) i <- i + 1
6) goto 2
7) print i

所以很明显在这种情况下,i 将会是7


感谢您的好解释。我一直对循环变量感到困惑,因此稍后将其重用作循环边界。 - why.n0t

1
我想强调的是,迭代计数控制循环范围执行的次数。更多详情请参考第98-99页"Fortran 90 ISO/IEC 1539 : 1991 (E)"
以下步骤按顺序执行:
  1. 循环初始化:

    1.1 如果 loop-control

        [ , ] do-variable = scalar-numeric-expr1 , scalar-numeric-expr2 [ , scalar-numeric-expr3 ]
    

    1.1.1 通过分别计算 scalar-numeric-expr1、scalar-numeric-expr2 和 scalar-numeric-expr3 来确定初始参数 m1、终止参数 m2 和增量参数 m3

    1.1.2 do-variable 的值被定义为初始参数 m1

    1.1.3 确定并返回迭代次数,其值为表达式

        MAX(INT((m2 –m1+m3)/m3),0)
    

    1.2 如果省略了 loop-control,则不计算迭代次数。

    1.3 在执行 DO 语句完成后,开始执行循环。

2.执行循环。DO结构的执行循环由以下步骤组成,这些步骤将重复执行,直到终止:

2.1 测试迭代计数(如果有)。如果迭代计数为零,则循环终止。

2.2 如果迭代计数不为零,则执行循环范围。

2.3 迭代计数(如果有)减一。如果存在DO变量,则增加增量参数m3的值。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接