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 to
s - 请耐心等待)
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)
。
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 to
s - 请耐心等待)
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)
。