循环是计算机科学运算领域的用语,也是一种常见的控制流程。循环是一段在程序中只出现一次,但可能会连续运行多次的代码。循环中的代码会运行特定的次数,或者是运行到特定条件成立时结束循环,或者是针对某一集合中的所有项目都运行一次。
在一些函数编程语言(例如Haskell和Scheme)中会使用递归或不动点组合子来达到循环的效果,其中尾部递归是一种特别的递归,很容易转换为迭代。
大部分编程语言都提供循环的指令,可以依指定的次数重复运行一段程序。
若指定的次数N小于1,编程语言会忽略整个循环不去运行,若指定的次数N为1,则循环只会运行一次。
在循环进行时,循环计数器也会随着变化,大部分的编程语言可以允许循环计数器上数或是下数,每次的变化量可以是1或是其他不为0的数值。
FOR I = 1 TO N for I := 1 to N do begin xxx xxx NEXT I end; DO I = 1,N for ( I=1; I<=N; ++I ) { xxx xxx END DO }
在许多编程语言中,循环计数器要使用整数才能得到准确的结果。由于硬件的限制,在循环计数器使用浮点数时,结果可能会不符预期,如以下的循环
for X := 0.1 step 0.1 to 1.0 do
依其四舍五入的误差、硬件及编译器的差异,不一定会运行10次,可能只会运行9次。而且X的数值可能会有些误差,不是预期的0.1, 0.2, 0.3, ..., 1.0。
大多数的编程语言都有指令,可以在特定条件成立时继续循环的进行,或是特定条件不成立时继续循环的进行,进行到特定条件成立为止。前者一般会标示while,后者一般会标示until。
其判断条件可能在循环一开始就进行,或是在循环最后才进行。前者的循环不一定会运行,而后者1的循环至少会运行一次。
DO WHILE (test) repeat xxx xxx LOOP until test; while (test) { do xxx xxx } while (test);
指定集合的循环
许多编程语言支持一种特别的循环,可以针对一个数组中的元素或是一个集合中的所有成员进行循环中的指令,包括Ada、D语言、Smalltalk、Perl、Java、C#、Visual Basic、Ruby、Python、JavaScript、Fortran 95等编程语言都有这类的循环结构:
someCollection do: . foreach (item; myCollection) { xxx } foreach someArray { xxx } Collection<String> coll; for (String s : coll) {} foreach (string s in myStringCollection) { xxx } $someCollection | ForEach-Object { $_ } forall ( index = first:last:step... )
泛用循环结构
有些编程语言有泛用循环结构,可以用来表示指定次数或指定条件的循环,像C语言的for指令或是Common Lisp语言中的do指令都是这类的例子,不过为了程序的可读性考量,在这些编程语言中还是尽量使用一些含义较明确的指令(如while指令)。
死循环一般会用在有一段程序需要永远运行,或是该程序在没有发生特殊事件(如故障)时需要永远运行的场合,例如一个事件驱动的程序需要持续运行循环,处理发生的事件,直到用户结束或中断程序为止。
若在指定条件的循环中,其判断条件用到的变量数值永远不会改变,这种程序错误也会使得此循环变成死循环。
当使用指定次数的循环查表时,会希望在查到需要的数据时就可以直接结束循环的进行,有些编程语言可以用break
或exit
的指令达到这様的功能,这些指令会结束这个循环,接着会运行循环后面的指令。若此循环在副程序中,也可以用return
中断循环的进行, 同时离开副程序。
以下是Ada编程语言的一个示例,利用exit ... when...
的方式中提早结束循环。
with Ada.Text IO;with Ada.Integer Text IO;procedure Print_Squares is X : Integer;begin Read_Data : loop Ada.Integer Text IO.Get(X); exit Read_Data when X = 0; Ada.Text IO.Put (X * X); Ada.Text IO.New_Line; end loop Read_Data;end Print_Squares;