添加的内容 删除的内容
小 (移除无用链接) |
小 (机器人:清理不当的来源、移除无用的模板参数) |
||
(未显示2个用户的2个中间版本) | |||
第2行: | 第2行: | ||
|G1 = IT |
|G1 = IT |
||
}} |
}} |
||
[[File:For-loop-diagram.png| |
[[File:For-loop-diagram.png|thumb|right|For loop flow diagram]] |
||
{{循环结构}} |
{{循环结构}} |
||
'''for |
'''for回圈'''({{lang-en|for loop}})在计算机科学是一种[[程式语言]]的[[迭代]][[陈述 (程式)|陈述]],能够让程式碼反覆的执行。 |
||
它跟其他的[[迴圈]],如[[while |
它跟其他的[[迴圈|回圈]],如[[while循环|while回圈]],最大的不同,是它拥有一个[[回圈计数器]],或是回圈变数。这使得for回圈能够知道在迭代过程中的执行顺序。 |
||
== for |
== for 回圈的种类 == |
||
=== 传统的 for |
=== 传统的 for 回圈 for-loops === |
||
[[C语言]]中传统的for-loop包含三个部分:初始化、 |
[[C语言]]中传统的for-loop包含三个部分:初始化、条件、递增,这三个部分都是可有可无的。<ref>{{cite web|url=http://www.learncpp.com/cpp-tutorial/57-for-statements/|title=For loops in C++|accessdate=2016-03-06}}</ref> |
||
:以Java为例: |
:以Java为例: |
||
<syntaxhighlight Lang="java"> |
<syntaxhighlight Lang="java"> |
||
第18行: | 第18行: | ||
} |
} |
||
</syntaxhighlight> |
</syntaxhighlight> |
||
初始化是宣告(或者 |
初始化是宣告(或者赋值)任何需要的变数的动作。如果你要使用多个变数,则变数的种类要一致。条件的部分则是检查是否离开这个回圈,也就是让程式碼往下执行。如果条件判断为假,则离开回圈。递增在每跑一次回圈都会重复执行一次。 |
||
:在此以Java为例: |
:在此以Java为例: |
||
<syntaxhighlight Lang="java"> |
<syntaxhighlight Lang="java"> |
||
第28行: | 第28行: | ||
System.out.println(); |
System.out.println(); |
||
</syntaxhighlight> |
</syntaxhighlight> |
||
=== 使用指标的for |
=== 使用指标的for回圈 === |
||
这种形式的for回圈是大多数其他for回圈的变革:他允许除了数字以外的计数方式。他通常用隐含或外显指标的方式呈现,而在此回圈变数会依序表示。以下是一个代表性的例子(语言:[[Python]]): |
|||
<syntaxhighlight Lang="python"> |
<syntaxhighlight Lang="python"> |
||
第37行: | 第37行: | ||
</syntaxhighlight> |
</syntaxhighlight> |
||
=== 矩 |
=== 矩阵化for回圈 === |
||
有一些语言支援比较特 |
有一些语言支援比较特别的for回圈,如同它可以同时处理所有的指标[[Automatic vectorization|in parallel]],像是在[[FORTRAN 95]]中的<code>for all</code>语法。 |
||
举例来 |
举例来说,在以下的for回圈[[虚擬碼]]片段,当计算<code>A(i)</code>的新的值,除了第一个(也就是 <code>i = 2</code>),<code>A(i - 1)</code>的参照会得到新的值。 |
||
然而,在<code>for all</code> 版本,每个计算都会使用一开始的值,不会更改 <code>A</code>. |
然而,在<code>for all</code> 版本,每个计算都会使用一开始的值,不会更改 <code>A</code>. |
||
'''for''' i := 2 : N - 1 '''do''' A(i) := [A(i - 1) + A(i) + A(i + 1)] / 3; '''next''' i; |
'''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 all''' i := 2 : N - 1 '''do''' A(i) := [A(i - 1) + A(i) + A(i + 1)] / 3; |
||
和一般的for |
和一般的for回圈可能差距比较大。 |
||
== 应用范例 == |
== 应用范例 == |
||
以c语言为例: |
以c语言为例: |
||
=== 作为[[无窮 |
=== 作为[[无窮回圈]] === |
||
<syntaxhighlight lang=C> |
<syntaxhighlight lang=C> |
||
for (;;) |
for (;;) |
||
printf("just keep going on!"); |
printf("just keep going on!"); |
||
</syntaxhighlight> |
</syntaxhighlight> |
||
这个程式碼会不断的印出"just keep going on!"。 |
|||
=== 配合[[矩 |
=== 配合[[矩阵]] === |
||
矩 |
矩阵赋值: |
||
<syntaxhighlight lang=C> |
<syntaxhighlight lang=C> |
||
for(int i=0;i<bound_of_matrix;i++) |
for(int i=0;i<bound_of_matrix;i++) |
||
matrix[i] = i; |
matrix[i] = i; |
||
</syntaxhighlight> |
</syntaxhighlight> |
||
以上給予矩 |
以上給予矩阵 matrix 依序从0到bound_of_matrix-1 的值。 |
||
=== [[巢狀 |
=== [[巢狀回圈]] === |
||
就像巢穴一样,一 |
就像巢穴一样,一层包覆一层,所以以下这个程式碼一共会执行(bound_of_x)乘上(bound_of_y)次。 |
||
<syntaxhighlight lang=C> |
<syntaxhighlight lang=C> |
||
for(int i=0;i<bound_of_x;i++) |
for(int i=0;i<bound_of_x;i++) |
||
第67行: | 第67行: | ||
</syntaxhighlight> |
</syntaxhighlight> |
||
== 常见的錯 |
== 常见的錯误 == |
||
=== 无窮 |
=== 无窮回圈 === |
||
这里指的是无意产生的无窮回圈,容易导致当机。 |
|||
:以C语言为例: |
:以C语言为例: |
||
<syntaxhighlight lang=C> |
<syntaxhighlight lang=C> |
||
第77行: | 第77行: | ||
=== 超出界限 === |
=== 超出界限 === |
||
[[編译器]]会 |
[[編譯器|编译器]]会显示out of bound,通常是指嘗试取矩阵界限外的值。 |
||
=== |
=== 回圈内的变数 === |
||
回圈内的变数在出回圈之后,便无法使用。 |
|||
== 发展概论 == |
== 发展概论 == |
||
主要 |
主要缘起为许多需要重复执行的程式碼,而不一样的程式语言也会有不一样的语法型式。 |
||
=== 1957: FORTRAN === |
=== 1957: FORTRAN === |
||
在Fortran 的<code>DO</code> |
在Fortran 的<code>DO</code> 回圈 同等于for回圈。 |
||
Fortran的 <CODE>DO</CODE> |
Fortran的 <CODE>DO</CODE> 回圈语法为: |
||
<syntaxhighlight lang=FORTRAN> |
<syntaxhighlight lang=FORTRAN> |
||
DO label counter = first, last, step |
DO label counter = first, last, step |
||
第92行: | 第92行: | ||
label statement |
label statement |
||
</syntaxhighlight> |
</syntaxhighlight> |
||
接下来的两个例子做出来的结果等同于其他语言的三个参数的for |
接下来的两个例子做出来的结果等同于其他语言的三个参数的for回圈。其中变数COUNTER被初始化为1,以1递增,并且到5的时候停下。 |
||
<syntaxhighlight lang=FORTRAN> |
<syntaxhighlight lang=FORTRAN> |
||
DO 9, COUNTER = 1, 5, 1 |
DO 9, COUNTER = 1, 5, 1 |
||
第99行: | 第99行: | ||
9 CONTINUE |
9 CONTINUE |
||
</syntaxhighlight> |
</syntaxhighlight> |
||
Fortran 77 或之后的版本,也可能 |
Fortran 77 或之后的版本,也可能写成: |
||
<syntaxhighlight lang=FORTRAN> |
<syntaxhighlight lang=FORTRAN> |
||
do counter = 1, 5 |
do counter = 1, 5 |
||
第105行: | 第105行: | ||
end do |
end do |
||
</syntaxhighlight> |
</syntaxhighlight> |
||
如果 |
如果递增为1,则递增的部分可以省略。例如: |
||
<syntaxhighlight lang=FORTRANfixed> |
<syntaxhighlight lang=FORTRANfixed> |
||
* DO loop example. |
* DO loop example. |
||
第122行: | 第122行: | ||
=== 1960: COBOL === |
=== 1960: COBOL === |
||
[[COBOL]]在 |
[[COBOL]]在许多努力之下,在1959年终正式格式化。他使用PERFORM 动词,而PERFORM动词有很多功能,像是后来加上的"结构化"的语法,像是 END-PERFORM。忽略宣告和初始化变数的必要,类似for回圈的语法为: |
||
<syntaxhighlight lang=COBOL> |
<syntaxhighlight lang=COBOL> |
||
PERFORM VARYING I FROM 1 BY 1 UNTIL I > 1000 |
PERFORM VARYING I FROM 1 BY 1 UNTIL I > 1000 |
||
第128行: | 第128行: | ||
END-PERFORM |
END-PERFORM |
||
</syntaxhighlight> |
</syntaxhighlight> |
||
如果PERFORM有TEST AFTER, |
如果PERFORM有TEST AFTER,这个回圈的执行的结果会有点不同:回圈内的程式会被执行至少一次。 |
||
=== 1964: BASIC === |
=== 1964: BASIC === |
||
[[BASIC]] 中的 |
[[BASIC]] 中的回圈有时称为 for-next回圈。 |
||
<syntaxhighlight lang="freebasic"> |
<syntaxhighlight lang="freebasic"> |
||
第147行: | 第147行: | ||
</syntaxhighlight> |
</syntaxhighlight> |
||
''LEAVE'' 指令可以用来结束 |
''LEAVE'' 指令可以用来结束回圈,像c语言的break,而''ITERATE''则像continue。 |
||
=== 1968: Algol 68 === |
=== 1968: Algol 68 === |
||
第178行: | 第178行: | ||
=== 1980: Maple === |
=== 1980: Maple === |
||
Maple有两种型式的for |
Maple有两种型式的for回圈,一个是指标一定范围的值,另一个是指标一定大小的容器。 |
||
第一种: |
第一种: |
||
第195行: | 第195行: | ||
=== 1982: PostScript === |
=== 1982: PostScript === |
||
他的for |
他的for回圈 <code>[initial] [increment] [limit] { ... } for</code> 初始化一个内部的变数, 并且执行到他不大于限制的值(若递增为负则以此类推)。<ref>{{cite book|title=PostScript Language Reference|publisher=Addison-Wesley Publishing Company|page=596|isbn=0-201-37922-8}}</ref> |
||
<syntaxhighlight lang=AppleScript> |
<syntaxhighlight lang=AppleScript> |
||
1 1 6 {STATEMENTS} for |
1 1 6 {STATEMENTS} for |
||
第288行: | 第288行: | ||
next = incr indx |
next = incr indx |
||
</syntaxhighlight> |
</syntaxhighlight> |
||
并且可以 |
并且可以这样使用: |
||
<syntaxhighlight lang="haskell"> |
<syntaxhighlight lang="haskell"> |
||
forLoopM_ (0::Int) (< len) (+1) $ \indx -> do -- whatever with the index |
forLoopM_ (0::Int) (< len) (+1) $ \indx -> do -- whatever with the index |
||
第320行: | 第320行: | ||
end</syntaxhighlight> |
end</syntaxhighlight> |
||
这个程式碼 <syntaxhighlight lang=Lua> |
|||
for i = 1, 5, 2 do |
for i = 1, 5, 2 do |
||
print(i) |
print(i) |
||
第337行: | 第337行: | ||
=== 1995: JavaScript === |
=== 1995: JavaScript === |
||
JavaScript 支援像是C语言的三个参数的 |
JavaScript 支援像是C语言的三个参数的回圈,并且支援break和continue。 |
||
<syntaxhighlight lang=JavaScript> |
<syntaxhighlight lang=JavaScript> |
||
for (let i = 0; i < 5; i++) { |
for (let i = 0; i < 5; i++) { |
||
第372行: | 第372行: | ||
=== 1996: OCaml === |
=== 1996: OCaml === |
||
请参考<ref>{{Cite web |url=http://caml.inria.fr/pub/docs/manual-ocaml-4.00/expr.html |title=OCaml expression syntax |accessdate=2016-03-06 }}</ref> |
|||
<syntaxhighlight lang="ocaml"> |
<syntaxhighlight lang="ocaml"> |
||
(* for_statement := "for" ident '=' expr ( "to" ∣ "downto" ) expr "do" expr "done" *) |
(* for_statement := "for" ident '=' expr ( "to" ∣ "downto" ) expr "do" expr "done" *) |