You need to enable JavaScript to run this app. Fortran中Do循环能否在开头和do关键字后同时使用label标签
优惠活动
大模型
产品
解决方案
定价
更多

Fortran中Do循环能否在开头和do关键字后同时使用label标签

问题1:你给出的Do循环写法是否合法?

你示例中的写法属于Fortran旧标准兼容的合法语法,但属于目前不推荐使用的过时风格,两个标签的作用完全不同:

  • do关键字后面跟的15是循环结束标签,用来标记当前Do循环的终止行位置,是Do循环旧语法的组成部分
  • 行首的10是普通行标签,和Do循环本身语法无关,只是用来给go to语句提供跳转目标,你可以把它加在任意可执行语句的行首,不止Do循环开头。

不过需要注意,旧标准中带结束标签的Do循环,终止行原本要求用continue语句,现代Fortran(Fortran90及以后)才允许把标签加在end do上,如果你用非常老的编译器可能会报错。


问题2:Do语句使用label的正确方式

1. 旧标准(Fortran77)的带标签Do循环写法

这是你示例中用法的标准形式,结束行用continue语句,兼容性最好:

program label_do_demo
implicit integer(a-z)
integer :: b = 20
! 10是普通行标签,供go to跳转
10 do 15 i = 1, 5
      b = b + i
! 15是do语句指定的循环结束标签,对应do后面的15
15 continue
if (b .eq. 35) go to 10
print *, b
end program

运行逻辑和你给出的示例完全一致,输出结果为50。

2. 现代Fortran(Fortran90+)推荐写法

目前所有主流编译器都支持的现代风格,不推荐使用任何行号标签和go to语句,可读性和可维护性更好,和你示例逻辑完全等价的写法如下:

program modern_do_demo
    implicit none
    integer :: b = 20, i
    do
        do i = 1, 5
            b = b + i
        end do
        if (b /= 35) exit
    end do
    print *, b
end program

如果确实需要给循环加标签(比如嵌套循环要跳出外层循环时),可以用现代的循环命名语法,不需要用行号标签:

program named_loop_demo
    implicit none
    integer :: i, j, sum
    ! 给外层循环加名称标签
    outer_loop: do i = 1, 10
        inner_loop: do j = 1, 10
            sum = i + j
            if (sum > 15) exit outer_loop ! 直接跳出外层循环
        end do inner_loop
    end do outer_loop
    print *, "sum超过15时的i,j值:", i, j
end program

内容的提问来源于stack exchange,提问作者Addiction99

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.16 09:24:01