fortran fortran中文资料网
手气不错
Article

027.exitCycle_循环跳出与跳过

2026年7月22日基础级

exitcycle都是循环体内部的流程控制语句,但它们改变循环流程的方式不同:cycle只跳过当前轮次,exit则结束当前循环。

可以把它们想象成处理一批数据时的两个决定:遇到暂时不需要处理的数据,跳过这一项继续检查;遇到已经满足停止条件的数据,结束整个循环。

两个语句的区别

语句作用后续流程
cycle跳过当前轮次剩余的循环体进入下一轮循环
exit立即结束当前所在的循环执行循环之后的语句

本例遍历1到8。用数字3用于演示cycle,以数字7用于演示exit。为使流程清楚,程序在两条控制语句执行前都输出说明。

本文代码

! cycle跳过当前循环轮次,exit结束当前循环。
program exitCycleDemo
  implicit none
  integer :: number
  integer :: processedCount
  processedCount = 0

  write (*,"(A)") "开始处理1到8:"

  do number = 1, 8
    if (number == 3) then
      write (*,"(A,I2,A)") "number=", number, ":cycle,跳过当前轮。"
      cycle
    end if

    if (number == 7) then
      write (*,"(A,I2,A)") "number=", number, ":exit,结束循环。"
      exit
    end if

    processedCount = processedCount + 1
    write (*,"(A,I2,A)") "number=", number, ":正常处理。"
  end do

  write (*,"(A,I2)") "实际处理数量:", processedCount
end program exitCycleDemo

执行结果

(base) hong@hongdeMacBook-Pro 027.exitCycle % gfortran exampleExitCycle.f90
(base) hong@hongdeMacBook-Pro 027.exitCycle % ./a.out
开始处理1到8:
number= 1:正常处理。
number= 2:正常处理。
number= 3:cycle,跳过当前轮。
number= 4:正常处理。
number= 5:正常处理。
number= 6:正常处理。
number= 7:exit,结束循环。
实际处理数量: 5

执行过程

  • number为1和2时,没有触发特殊条件,程序增加processedCount并输出正常处理信息。
  • number为3时进入第一个if,输出说明后执行cycle。本轮后面的语句,包括计数和正常处理输出,都不会执行。
  • number为4、5和6时继续正常处理。
  • number为7时执行exit,立即离开循环,因此不会检查8。
  • 最终处理了1、2、4、5、6五个数字,所以processedCount为5。

嵌套循环中的 exit

在嵌套循环中,普通exit只会退出离它最近的那一层循环。如果要从内层循环直接结束外层循环,应给循环构造命名:

outer_loop: do row = 1, rowCount
  inner_loop: do column = 1, columnCount
    if (found) exit outer_loop
  end do inner_loop
end do outer_loop

这里的exit outer_loop明确表示退出名为outer_loop的循环。命名可以避免读者误以为只离开了内层循环,也适合矩阵搜索和查找第一个满足条件的位置。

常见错误

  • cycle理解成结束循环。它只结束当前轮次,下一轮仍然可能执行。或是把普通exit理解成退出所有嵌套循环。它默认只退出最近的一层;暂不介绍跨层退出。
  • do while中使用cycle时忘记更新循环条件所依赖的变量,可能导致无限循环。
  • 把判断写在处理语句之后,导致本来应该跳过或停止的数据已经被处理。应先判断,再执行正常处理。

知识点总结

  • cycle跳过当前轮次,保留后续循环。
  • exit结束当前循环,继续执行循环之后的语句。
  • 嵌套循环需要注意exit的作用范围;必要时使用命名循环构造。
  • 流程控制语句应放在正常处理之前,并确保不会破坏循环变量或循环终止条件。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注