Fortran 77 DO 标签也被 IF/GOTO 使用

问题描述 投票:0回答:1

我有一个旧的 Fortran 77 代码,我希望尽可能保持不变。由于

gfortran
给出了循环警告,我正在考虑将非块循环更改为块模式。但后来我意识到一些
GOTO
语句也使用相同的循环标签。现在我不确定编译器对于标签后面的语句的行为如何。

所以我的问题是我是否可以“现代化”这个示例代码:

INTEGER i DO 30 i = 1, 14 IF <SOME CONDITION> GOTO 30 <SOME COMMANDS HERE> 30 WRITE(*,*) i <SOME FOLLOWING STATEMENTS>
对于这个:

INTEGER i DO 30 i = 1, 14 WRITE(*,*) i IF <SOME CONDITION> GOTO 30 <SOME COMMANDS HERE> 30 CONTINUE <SOME FOLLOWING STATEMENTS>
甚至这个:

INTEGER i DO i = 1, 14 WRITE(*,*) i IF <SOME CONDITION> GOTO 30 <SOME COMMANDS HERE> END DO 30 <SOME FOLLOWING STATEMENTS>
在后一种形式中,我不确定标签应该放在

END DO

还是下面的语句?

fortran gfortran
1个回答
0
投票
带有循环终止标签的行属于循环(即在每次迭代时执行指令),这意味着在初始版本中循环始终执行直到 i=15。因此,你的第三个版本是错误的。第二个版本就OK了。

但是如果你想让代码现代化,你可以这样写:

INTEGER i DO 30 i = 1, 14 IF (.NOT.<SOME CONDITION>) THEN <SOME COMMANDS HERE> END IF WRITE(*,*) i END DO <SOME FOLLOWING STATEMENTS>
或者另一种选择

INTEGER i DO 30 i = 1, 14 WRITE(*,*) i IF (<SOME CONDITION>) CYCLE ! directly starts the next iteration <SOME COMMANDS HERE> END DO <SOME FOLLOWING STATEMENTS>
    
© www.soinside.com 2019 - 2024. All rights reserved.