exit和cycle都是循环体内部的流程控制语句,但它们改变循环流程的方式不同: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的作用范围;必要时使用命名循环构造。
- 流程控制语句应放在正常处理之前,并确保不会破坏循环变量或循环终止条件。