Julia语言程序设计
上QQ阅读APP看书,第一时间看更新

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

这些细节需要在开发过程中仔细规划,以免引入不必要的逻辑问题。