5.3.1 while
基于关键字while的循环结构同if结构类似,也需要将逻辑表达式作为判断条件,基本语法如下:
while 条件表达式 # 语句块 end
只有在“条件表达式”为true时,while内部的语句块才会执行。
在while内部的语句运行到end时,会再次返回对条件进行判断,如果为false,则忽略while内部的语句块,直接跳到end处执行其后的其他语句。
为了对while循环进行动态控制,一般其判断表达式中有控制变量,而且能在内部语句块进行更新,从而可以修改下次判断条件的逻辑结果。例如:
julia> i = 1; # 循环控制变量 julia> while i <= 5 # 循环条件 print(i, " ") # 处理过程 global i += 1 # 改变控制变量的值,其中的global关键字后文会介绍 end 1 2 3 4 5
若非如此,条件便始终不变,while就会变成死循环或无限循环。
提示 只有在必要的情况下才会采用无限循环,例如在服务器接受远程客户端连接的代码中。为了能够提供全时候的服务,服务端一般会以死循环的方式等待并不断接受客户端进入。
当然,对于条件表达式结果恒定不变的无限循环,也可以在满足内部某条件时通过关键字break打断循环过程。例如:
julia> i = 1; # 控制变量 julia> while true # 始终满足条件 print(i, " ") # 处理过程 if i > 5 # 循环控制 break # 满足控制条件即会强制退出循环 end global i += 1 # 修改控制变量 end 1 2 3 4 5 6
其中,虽然while的条件表达式始终为true,成为无限循环结构,但通过控制变量与break的结合使用,可在需要时退出循环。此例实现了与上例相似的功能,只是结果略有不同,有兴趣的读者可以对比研究一下。
关键字break能够强制循环退出,但在多层嵌套的循环中只会影响其所处的那一层,不会波及外层或内层循环结构。例如:
julia> i=1; j=1; julia> while j <= 4 while true print(i, " ") if i > 5 # 内层循环控制 break # 强制退出内层循环 end global i += 1 # 修改内层循环的控制变量 end global j += 1 # 修改外层循环的控制变量 global i = 1 # 重置内层循环的控制变量 println() # 换行打印 end 1 2 3 4 5 6 1 2 3 4 5 6 1 2 3 4 5 6 1 2 3 4 5 6
例中break导致内层while循环只执行到i=6时跳出,但外层由j控制的while循环并没有受到break的任何影响,顺利执行了4次。
同样用于循环控制的continue关键字,功能不同于break,不是打断循环,而是让循环运行到其位置时停止执行后续语句,并立即跳转到条件表达式处重新判断,如果条件成立便会再次重入循环。例如:
julia> i = 1; julia> while i < 10 global i += 1 # 修改控制变量 if i < 5 # 循环控制 continue # 满足i<5时跳到while处 end print(i, " ") # 处理过程 end 5 6 7 8 9 10
其中,循环控制变量i以10为上界,只要小于10便会不断运行循环体内的语句;但在i小于5的情况下,不会执行continue之后的代码,所以打印出的结果都是不小于5的数值。
类似于break,关键字continue也只控制着其所处的当前层循环,不影响外层或内层的循环结构。例如:
julia> i=1; j=1; julia> while j <= 4 while i < 10 golbal i += 1 # 修改内层循环的控制变量 if i < 5 # 内层循环控制 continue # 忽略内层循环后续语句 end print(i, " ") end golbal j += 1 # 修改外层循环的控制变量 golbal i = 1 # 重置内层循环的控制变量 println() # 换行打印 end 5 6 7 8 9 10 5 6 7 8 9 10 5 6 7 8 9 10 5 6 7 8 9 10
这些细节需要在开发过程中仔细规划,以免引入不必要的逻辑问题。