循环开头可以有标签吗

Can do loops have a label at the beginning

目前我正在学习 Fortran!
Do 循环是否可以在开头以及 do 关键字之后有 label,如示例所示??

program sample
implicit integer(a-z)
integer :: b = 20
10 do 15 i = 1, 5
      b = b + i
15 end do
if (b .eq. 35) go to 10
print *, b
end program

如果不是,do statement(带示例程序)中标签的正确使用方法是什么??

引用现行标准(F2018 6.2.5):

Any statement that is not part of another statement, and that is not preceded by a semicolon in fixed form, may begin with a statement label

像这样的 DO 语句不是另一个语句的一部分:是的,它可能被标记。

也就是说,当您将它用作 go to 目标时,您可以认为有 个标记而不是标记 DO 语句。

此外,您也应该尽量避免使用 15 标签。它不仅是多余的(带标签的语句是 end do),而且“带标签的 DO 语句”)已经过时,可能会从标准中删除。 (“非块 DO 构造”,其中标记的语句不是 end do,已在 Fortran 2018 中删除,因此删除不是一个空洞的威胁。)

这些点一起给出了没有任何标签且没有go to:

的程序
  implicit none
  integer :: b, i

  b=20

  do
    do i = 1, 5
       b = b + i
    end do
    if (b .ne. 35) exit  ! or /= instead of .ne.
  end do

  print *, b
end

(我也使用了 implicit none 并使用了 b 的赋值而不是初始化。)

总的来说,虽然你可以在很多地方放置标签,但应该使用标签的地方非常非常少。


“另一条语句的一部分”使类似以下行的行变坏:

if (.true.) 10 print *, "Hello"

这里的PRINT语句是一个action语句,它是IF语句的一部分。虽然 IF 语句作为一个整体可能被标记,但 PRINT 语句是该语句的一部分,因此可能没有被标记。