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
相关产品推荐
相关产品推荐

