【问题标题】:Value of Fortran DO loop index after the loop [duplicate]循环后Fortran DO循环索引的值[重复]
【发布时间】:2013-08-11 09:09:40
【问题描述】:

DO 循环是如何工作的?

假设您有以下循环:

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

write(*,*)I

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

但是当循环由于一个

而停止时
if(something) exit

I 符合预期(例如 i=7,退出,因为某个其他值达到了它的限制)。

【问题讨论】:

  • 抱歉,没有找到这个问题。我的是重复的。感谢您的提示。
  • 另见Fortran 2008 standard 的 8.1.6.6.2 和 8.1.6.6.4 部分。后者声明:“当 DO 构造变为非活动状态时,DO 构造的 DO 变量(如果有)将保留其最后定义的值。”,而前者给出了循环迭代的详细信息。

标签: loops fortran do-loops


【解决方案1】:

i 的值在do 循环确定它必须终止之前转到1111 的值是i 的第一个值,它导致1..10 的结束条件失败。所以当循环完成后,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

【讨论】:

  • 感谢您的精彩解释。我总是对循环变量有问题,因此我稍后将它作为循环绑定重用。
【解决方案2】:

我想强调的是,控制循环范围执行次数的是迭代计数。详情请参阅第98-99页"Fortran 90 ISO/IEC 1539 : 1991 (E)"

以下步骤依次执行:

  1. 循环启动

    1.1 如果 循环控制

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

    1.1.1 初始参数m1、终端参数m2和增量参数m3通过评估scalar-numeric-建立分别为 expr1、scalar-numeric-expr2 和 scalar-numeric-expr3,

    1.1.2 do-variable 用初始参数m1的值定义。

    1.1.3 迭代次数成立,是表达式的值

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

    1.2 如果省略循环控制,则不计算迭代次数。

    1.3 DO语句执行完毕,开始执行循环。

2.执行周期。 DO 构造的执行周期由以下按顺序重复执行的步骤组成,直到 终止:

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

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

2.3 迭代计数(如果有)减一。 DO 变量(如果有)按增量参数 m3 的值递增。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多