For 迴圈

for 迴圈（for loop）在電腦科學是一種程式語言的迭代陳述，能夠讓程式碼反覆的執行。

它跟其他的迴圈，如 while 迴圈，最大的不同，是它擁有一個迴圈計數器，或是迴圈變數。這使得 for 迴圈能夠知道在迭代過程中的執行順序。

for 迴圈的種類

1.1 傳統的 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

1.2 使用指標的 for 迴圈

這種形式的 for 迴圈是大多數其他 for 迴圈的變革：他允許除了數字以外的計數方式。他通常用隱含或外顯指標的方式呈現，而在此迴圈變數會依序表示。以下是一個代表性的例子 (語言：Python)：

for item in someiterableobject:

do Something

do Something Else

1.3 矩陣化 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 語言為例：

2.1 作為無窮迴圈

for (;;)

printf ("just keep going on!");

這個程式碼會不斷的印出 "just keep going on!"。

2.2 配合矩陣

矩陣賦值：

for (int i=0;i

以上給予矩陣 matrix 依序從 0 到 boundofmatrix-1 的值。

2.3 巢狀迴圈

就像巢穴一樣，一層包覆一層，所以以下這個程式碼一共會執行 (boundofx) 乘上 (boundofy) 次。

for (int i=0;i

常見的錯誤

3.1 無窮迴圈

這裡指的是無意產生的無窮迴圈，容易導致當機。

以 C 語言為例：

for (int i=0;i

3.2 超出界限

編譯器會顯示 out of bound，通常是指嘗試取矩陣界限外的值。

3.3 迴圈內的變數

迴圈內的變數在出迴圈之後，便無法使用。

發展概論

主要緣起為許多需要重複執行的程式碼，而不一樣的程式語言也會有不一樣的語法型式。

4.1 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 + I2

200 PRINT 206, SUMSQ

206 FORMAT (I2)

END

4.2 1958: Algol

Algol 在 Algo158 首次正式格式化。

4.3 1960: COBOL

COBOL 在許多努力之下，在 1959 年終正式格式化。他使用 PERFORM 動詞，而 PERFORM 動詞有很多功能，像是後來加上的＂結構化＂的語法，像是 END-PERFORM。忽略宣告和初始化變數的必要，類似 for 迴圈的語法為：

PERFORM VARYING I FROM 1 BY 1 UNTIL I > 1000

ADD I2 TO SUM-SQ.

END-PERFORM

如果 PERFORM 有 TEST AFTER，這個迴圈的執行的結果會有點不同：迴圈內的程式會被執行至少一次。

4.4 1964: BASIC

BASIC 中的迴圈有時稱為 for-next 迴圈。

For I = 1 to 5;

Print I;

Next I

4.5 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。

4.6 1968: Algol 68

Algol68 很類似現在的 for 語言了：

FOR i FROM 1 BY 2 TO 3 WHILE i≠4 DO ~ OD

4.7 1970: Pascal

for Counter := 1 to 5 do

(statement);

4.8 1972: C/C++

for (initialization; condition; increment/decrement)

statement

4.9 1972: Smalltalk

4.10 1980: Ada

for Counter in 1 .. 5 loop

-- statements

end loop;

4.11 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;

4.12 1982: PostScript

他的 for 迴圈 initial increment limit {...} for 初始化一個內部的變數，並且執行到他不大於限制的值 (若遞增為負則以此類推)。

1 1 6 {STATEMENTS} for

4.13 1983: Ada 83 and above

procedure Main is

Sum_Sq : Integer := 0;

begin

for I in 1 .. 9999999 loop

if Sum_Sq

4.14 1984: MATLAB

for i = 1:5

-- statements

end

4.15 1987: Perl

for ($counter = 1; $counter

4.16 1988: Mathematica

Dofx, {x, 0, 1, 0.1}

Forx= 0 , x

4.17 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

4.18 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

4.19 1991: Oberon-2, Oberon-07, or Component Pascal

FOR Counter := 1 TO 5 DO

( statement sequence )

END

4.20 1991: Python

for counter in range (1, 6): # range (1, 6) gives values from 1 to 5 inclusive (but not 6)

statements

4.21 1993: AppleScript

repeat with i from 1 to 5

	-- statements

	log i

end repeat

4.22 1993: Lua

for i = start, stop, interval do

-- statements

end

這個程式碼

for i = 1, 5, 2 do

print (i)

end 即會印出：

1 3 5

4.23 1995: Java

for (int i = 0; i

4.24 1995: JavaScript

JavaScript 支援像是 C 語言的三個引數的迴圈，並且支援 break 和 continue。

for (let i = 0; i

4.25 1995: PHP

for ($i = 0; $i ";}

4.26 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

4.27 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 ;;

4.28 1998: ActionScript 3

for (var counter:uint = 1; counter