Fortran 77 Do Loop 块说明

Fortran 77 Do Loop block clarification

NUM 和 ARRAY 双精度变量,不确定 if 块将如何执行。什么时候停止?它实际上在做什么?,如果我们转到 8,那么我们是否退出 do 循环?

谢谢

DO 7 I = 1,28                                                   
IF (NUM - ARRAY(I)) 8,7,7                                    
7 CONTINUE                                                         
I=29                                                             
8 NUM = ARRAY(I) 
....
....
....
....

这称为算术如果:if(a) 1,2,3。这意味着:如果 a<0 它转到 1,如果 (a==0) 它转到 2 如果 (a>0) 它转到 3.

在你的代码中 if( num-array(i)<0 ) 它转到 8(退出循环并跳过另一行),否则它转到 7(循环)。

如前所述,循环中的条件是 arithmetic if statement.

我们知道(这在之前的回答中明确说明)如果 num 小于 array(i),则选择标签 8,否则选择标签 7被选中。其他答案中还指出,这些具有退出循环或循环循环的效果。准确的说,我继续。

DO 结构有一个范围。像问题中的那样的非块 DO 构造的范围由 do 语句和 DO 终止语句(在本例中为 7 continue 之间并包括在内)组成。 DO 终止语句是从构造范围内跳转的有效目标。

当跳转到DO终止语句时,执行仍在构造范围内。执行该终止语句(在本例中,continue,什么都不做)并再次测试循环迭代条件。即循环循环。

从 DO 构造内部,跳转到构造范围之外的语句会终止构造的执行:就像退出一样。

然后,此示例具有使用 IF 构造的等效形式(带有 go tos - 请耐心等待)

DO 7 I = 1,28
IF (NUM < ARRAY(I)) THEN
  GO TO 8
ELSE
  GO TO 7
END IF
7 CONTINUE
I=29
8 NUM = ARRAY(I)

现在,因为标记为 7 的语句是 continue 语句,我们可以将其写为

DO 7 I = 1,28
IF (NUM < ARRAY(I)) THEN
  GO TO 8
ELSE
  CYCLE
END IF
7 CONTINUE
I=29
8 NUM = ARRAY(I)

这仍然很难看(不仅仅是因为所有的大写字母)。幸运的是,我们可以让它更漂亮。 i=29 语句只有在循环终止且没有跳转到标记为 8 的语句时才会执行。现在,循环索引 i 具有控制权 I = 1,28,因此当循环自然终止时,索引已经 has the value 29。该赋值没有任何作用(在现代 Fortran 中),因此我们可以将其删除。这给我们留下了

DO 7 I = 1,28
IF (NUM < ARRAY(I)) THEN
  GO TO 8
ELSE
  CYCLE
END IF
7 CONTINUE
8 NUM = ARRAY(I)

当我们还注意到 IF 结构紧接着是循环结束(因此我们不需要显式循环)时,我们有

DO 7 I = 1,28
IF (NUM < ARRAY(I)) EXIT
7 CONTINUE
NUM = ARRAY(I)

或(更好)

DO I = 1,28
  IF (NUM < ARRAY(I)) EXIT
END DO
NUM = ARRAY(I)

这个例子所做的就是找到 array(1:28) 中最早的元素的值,它大于 num,或者如果 none 是 array(29)