Fortran 77 Do Loop块说明

问题描述:

NUM和ARRAY都是双精度变量,不知道if块将如何执行。什么时候会停止?它究竟在做什么?如果我们到8,那么我们是否退出do循环?Fortran 77 Do Loop块说明

感谢

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

这看起来像现代语言,例如C? – LionsFan

+0

DO循环来自1-3行。当你在第四行时,你离开DO循环。 – gbdcool

+0

如果我从第2行到第4行怎么办?当条件满足时?那么我走出了循环?称这是'休息'声明是否安全? – LionsFan

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

我们知道(而这明确在此以前的答案说明),如果num小于array(i)标签8选择,否则标签7选择。在另外一个答案中也指出,这些都有退出循环或循环的效果。准确地说,我会继续。

DO结构有一个范围。像问题中那样的非块DO构造具有包括do语句和DO终止语句(在这种情况下为7 continue)之间的语句的范围。 DO终止声明是构造范围内跳转的有效目标。

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

在DO构造中,跳转到构造范围之外的语句会终止构造的执行:如出口。

这个例子,那么,具有使用IF构造等价形式(与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控制着I = 1,28,所以当循环终止时,索引已经是has the value29。这个任务什么都不做(在现代的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更大,或最早元素的值如果没有。

+0

这就是我无法编辑标签的原因。我相信我投票结束时会有重复(有几个),但是如果我失去了锤子特权,它将不会在审查队列中获得足够的选票,而且选票将会消失。我们需要更多拥有金色标签徽章的人。 –

+0

对于重复的目标,你有一个好的建议吗?我没有看到一个(显然),但我仍然对这个问题有近距离投票。 – francescalus

+0

这一个https://*.com/questions/11124855/fortran-if-statement-with-numbers-labels-rather-than-another-statement已经是其他两个目标。我现在也有投票权,他们在无效时得到退款。 –

这就是所谓的算术,如果:if(a) 1,2,3。它的意思是:如果a<0它变为1,如果(a==0)它去2,并且如果它(a>0)如果(NUM-阵列(ⅰ)< 0)它进入8变为3.

在代码(退出循环并跳过另一行),否则它将转到7(循环)。

+0

谢谢你的回答。 – LionsFan