【For回圈】
For loop flow diagram
for回圈（for loop）在电脑科学是一种程式语言的迭代陈述，能够让程式码反复的执行。
它跟其他的回圈，如while回圈，最大的不同，是它拥有一个回圈计数器，或是回圈变数。这使得for回圈能够知道在迭代过程中的执行顺序。
==for 回圈的种类==
=== 传统的 for 回圈 for-loops ===
C语言中传统的for-loop包含三个部分：初始化、条件、递增，这三个部分都是可有可无的。
以Java为例：
for (INITIALIZATION; CONDITION; AFTERTHOUGHT)
{
// Code for the for-loop's body goes here.
}
初始化是宣告（或者赋值）任何需要的变数的动作。如果你要使用多个变数，则变数的种类要一致。条件的部分则是检查是否离开这个回圈，也就是让程式码往下执行。如果条件判断为假，则离开回圈。递增在每跑一次回圈都会重复执行一次。
在此以Java为例：
for (int i=0; i
=== 使用指标的for回圈 ===
这种形式的for回圈是大多数其他for回圈的变革：他允许除了数字以外的计数方式。他通常用隐含或外显指标的方式呈现，而在此回圈变数会依序表示。以下是一个代表性的例子(语言：Python)：
for item in some_iterable_object:
do Something
do Something Else
=== 矩阵化for回圈 ===
有一些语言支援比较特别的for回圈，如同它可以同时处理所有的指标in parallel，像是在FORTRAN 95中的for all语法。
举例来说，在以下的for回圈虚拟码片段，当计算A(i)的新的值，除了第一个(也就是 i = 2)，A(i - 1)的参照会得到新的值。
然而，在for all 版本，每个计算都会使用一开始的值，不会更改 A.
for     i := 2 : N - 1 do A(i) := A(i - 1) + A(i) + A(i + 1) / 3; next i;
for all i := 2 : N - 1 do A(i) := A(i - 1) + A(i) + A(i + 1) / 3;
和一般的for回圈可能差距比较大。
==应用范例==
以c语言为例：
===作为无穷回圈===
for (;;)
printf("just keep going on!");
这个程式码会不断的印出"just keep going on!"。
===配合矩阵===
矩阵赋值：
for(int i=0;i
以上给予矩阵 matrix 依序从0到bound_of_matrix-1 的值。
===巢状回圈===
就像巢穴一样，一层包覆一层，所以以下这个程式码一共会执行(bound_of_x)乘上(bound_of_y)次。
for(int i=0;i
==常见的错误==
===无穷回圈===
这里指的是无意产生的无穷回圈，容易导致当机。
以C语言为例：
for (int i=0;i
===超出界限===
编译器会显示out of bound，通常是指尝试取矩阵界限外的值。
===回圈内的变数===
回圈内的变数在出回圈之后，便无法使用。
==发展概论==
主要缘起为许多需要重复执行的程式码，而不一样的程式语言也会有不一样的语法型式。
===1957: FORTRAN===
在Fortran 的DO 回圈 同等于for回圈。
Fortran的 DO 回圈语法为：
DO label counter = first, last, step
statements
label  statement
接下来的两个例子做出来的结果等同于其他语言的三个参数的for回圈。其中变数COUNTER被初始化为1，以1递增，并且到5的时候停下。
DO 9, COUNTER = 1, 5, 1
WRITE (6,8) COUNTER
8    FORMAT( I2 )
9  CONTINUE
Fortran 77 或之后的版本，也可能写成：
do counter = 1, 5
write(*, '(i2)') counter
end do
如果递增为1，则递增的部分可以省略。例如：
* DO loop example.
PROGRAM MAIN
SUM SQ = 0
DO 199 I = 1, 9999999
IF (SUM SQ.GT.1000) GO TO 200
199        SUM SQ = SUM SQ + I**2
200      PRINT 206, SUMSQ
206      FORMAT( I2 )
END
===1958: Algol===
Algol 在Algo158首次正式格式化。
===1960: COBOL===
COBOL在许多努力之下，在1959年终正式格式化。他使用PERFORM 动词，而PERFORM动词有很多功能，像是后来加上的＂结构化＂的语法，像是 END-PERFORM。忽略宣告和初始化变数的必要，类似for回圈的语法为：
PERFORM VARYING I FROM 1 BY 1 UNTIL I > 1000
ADD I**2 TO SUM-SQ.
END-PERFORM
如果PERFORM有TEST AFTER，这个回圈的执行的结果会有点不同：回圈内的程式会被执行至少一次。
===1964: BASIC===
BASIC 中的回圈有时称为 for-next回圈。
For I = 1 to 5;
Print I;
Next I
===1964: PL/I===
由IBM公司在1950年代发明的第三代高级程式语言， 有些类似PASCAL语言。
以下为PLI使用例：
do counter = 1 to 5 by 1; /* "by 1" is the default if not specified */
/*statements*/;
end;
LEAVE 指令可以用来结束回圈，像c语言的break，而ITERATE则像continue。
===1968: Algol 68===
Algol68 很类似现在的for语言了：
FOR i FROM 1 BY 2 TO 3 WHILE i≠4 DO ~ OD
===1970: Pascal===
for Counter := 1 to 5 do
(*statement*);
===1972: C/C++===
for (initialization; condition; increment/decrement)
statement
===1972: Smalltalk===
===1980: Ada===
for Counter in 1 .. 5 loop
-- statements
end loop;
===1980: Maple===
Maple有两种型式的for回圈，一个是指标一定范围的值，另一个是指标一定大小的容器。
第一种：
for i from f by b to t while w do
# loop body
od;
第二种：
for e in c while w do
# loop body
od;
===1982: PostScript===
他的for回圈 initial increment limit { ... } for 初始化一个内部的变数, 并且执行到他不大于限制的值(若递增为负则以此类推)。
1 1 6 {STATEMENTS} for
===1983: Ada 83 and above===
procedure Main is
Sum_Sq : Integer := 0;
begin
for I in 1 .. 9999999 loop
if Sum_Sq
===1984: MATLAB===
for i = 1:5
-- statements
end
===1987: Perl===
for ($counter = 1; $counter
===1988: Mathematica===
Dofx, {x, 0, 1, 0.1}
Forx= 0 , x
===1989: Bash===
*第一种
for i in 1 2 3 4 5
do
# must have at least one command in loop
echo $i  # just print value of i
done
*第二种
for (( i = 1; i
===1990: Haskell===
forM_ 1..5 $ \indx -> do statements
如果你想要用更正式的方式存 1..5的内容，一个比较官方的方式为：
import Control.Monad as M
forLoopM_ :: Monad m => a -> (a -> Bool) -> (a -> a) -> (a -> m ()) -> m ()
forLoopM_ indx prop incr f = do
f indx
M.when (prop next) $ forLoopM_ next prop incr f
where
next = incr indx
并且可以这样使用：
forLoopM_ (0::Int) ( do -- whatever with the index
===1991: Oberon-2, Oberon-07, or Component Pascal===
FOR Counter := 1 TO 5 DO
(* statement sequence *)
END
===1991: Python===
for counter in range(1, 6):  # range(1, 6) gives values from 1 to 5 inclusive (but not 6)
# statements
===1993: AppleScript===
repeat with i from 1 to 5
-- statements
log i
end repeat
===1993: Lua===
for i = start, stop, interval do
-- statements
end
这个程式码
for i = 1, 5, 2 do
print(i)
end即会印出：
1 3 5
=== 1995: Java ===
for (int i = 0; i
===1995: JavaScript===
JavaScript 支援像是C语言的三个参数的回圈，并且支援break和continue。
for (let i = 0; i
===1995: PHP===
for ($i = 0; $i ";
}
===1995: Ruby===
for counter in 1..5
# statements
end
5.times do |counter|  # counter iterates from 0 to 4
# statements
end
1.upto(5) do |counter|
# statements
end
===1996: OCaml===
请参考
(* for_statement := "for" ident '='  expr  ( "to" ∣  "downto" ) expr "do" expr "done" *)
for i = 1 to 5 do
(* statements *)
done ;;
for j = 5 downto 0 do
(* statements *)
done ;;
===1998: ActionScript 3===
for (var counter:uint = 1; counter
== 参考文献 ==
https://web.archive.org/web/20180906124543/http://terms.naer.edu.tw/detail/2337520/