Fortran 77 Do Loop块澄清

时间:2017-08-24 14:44:03

标签: fortran fortran77

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) 
....
....
....
....

2 个答案:

答案 0 :(得分:1)

如果:if(a) 1,2,3,则称为算术运算。它表示:如果a<0为1,则(a==0)为2,如果(a>0)则为3。

在你的代码中

如果(num-array(i)&lt; 0)它变为8(退出循环并跳过另一行),否则它变为7(循环)。

答案 1 :(得分:1)

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

我们知道(并且在此前的答案中已明确说明),如果num小于array(i),则选择标签8,否则标记{{1被选中了。它还在其他答案中说明这些具有退出循环或循环循环的效果。确切地说,我会继续。

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

当跳转到DO终止语句时,执行仍然在构造的范围内。执行终止语句(在这种情况下,7 continue,什么都不做),并再次测试循环迭代条件。也就是说,循环循环。

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

然后,这个例子具有使用IF构造的等效形式(continue s - 跟我一起承担)

go to

现在,因为标记为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,因此当循环自然终止时,索引已经has the value I = 1,28。该任务没有任何作用(在现代Fortran中),因此我们可以删除它。这让我们留下了

29

当我们注意到IF结构紧跟循环结束后(因此我们不需要明确循环)我们有

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

或(更好)

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