我有一个旧的 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
还是下面的语句?
但是如果你想让代码现代化,你可以这样写:
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>