For迴圈:修订间差异

求闻百科,共笔求闻
添加的内容 删除的内容
(移除无用链接)
(机器人:清理不当的来源、移除无用的模板参数)
 

(未显示2个用户的2个中间版本)

第2行: 第2行:
|G1 = IT
|G1 = IT
}}
}}
[[File:For-loop-diagram.png|缩略图||For loop flow diagram]]
[[File:For-loop-diagram.png|thumb|right|For loop flow diagram]]
{{循环结构}}
{{循环结构}}
'''for圈'''({{lang-en|for loop}})在计算机科学是一种[[程式语言]]的[[迭代]][[述 (程式)|述]],能让程式碼反覆的行。
'''for圈'''({{lang-en|for loop}})在计算机科学是一种[[程式语言]]的[[迭代]][[述 (程式)|述]],能让程式碼反覆的行。


它跟其他的[[迴圈]],如[[while圈]],最大的不同,是它拥有一个[[圈计数器]],或是数。使得for圈能知道在迭代过程中的行顺序。
它跟其他的[[迴圈|回圈]],如[[while循环|while回圈]],最大的不同,是它拥有一个[[圈计数器]],或是数。使得for圈能知道在迭代过程中的行顺序。


== for 圈的种类 ==
== for 圈的种类 ==
=== 传统的 for 圈 for-loops ===
=== 传统的 for 圈 for-loops ===
[[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>
[[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]]):
种形式的for圈是大多数其他for圈的革:他允除了数字以外的计数方式。他通常用含或外指标的方式呈现,而在此数会依序表示。以下是一个代表性的例子(语言:[[Python]]):
<syntaxhighlight Lang="python">
<syntaxhighlight Lang="python">
第37行: 第37行:
</syntaxhighlight>
</syntaxhighlight>


=== 矩化for圈 ===
=== 矩化for圈 ===
有一些语言支援比较特的for圈,如同它可以同处理所有的指标[[Automatic vectorization|in parallel]],像是在[[FORTRAN 95]]中的<code>for all</code>语法。
有一些语言支援比较特的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>的参照会得到新的值。
举例来,在以下的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!"。
个程式碼会不断的印出"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 的值。
以上給予矩 matrix 依序0到bound_of_matrix-1 的值。
=== [[巢狀圈]] ===
=== [[巢狀圈]] ===
就像巢穴一样,一包覆一,所以以下个程式碼一共会行(bound_of_x)乘上(bound_of_y)次。
就像巢穴一样,一包覆一,所以以下个程式碼一共会行(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,通常是指嘗试取矩界限外的值。
[[編譯器|编译器]]会示out of bound,通常是指嘗试取矩界限外的值。


=== 圈内的数 ===
=== 圈内的数 ===
圈内的数在出圈之后,便无法使用。
圈内的数在出圈之后,便无法使用。
== 发展概论 ==
== 发展概论 ==
主要起为多需要重复行的程式碼,而不一样的程式语言也会有不一样的语法型式。
主要起为多需要重复行的程式碼,而不一样的程式语言也会有不一样的语法型式。


=== 1957: FORTRAN ===
=== 1957: FORTRAN ===
在Fortran 的<code>DO</code> 圈 同等于for圈。
在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圈。其中数COUNTER被初始化为1,以1增,并且到5的候停下。
接下来的两个例子做出来的结果等同于其他语言的三个参数的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,則遞增的部分可以省略。例如:
如果增为1,则递增的部分可以省略。例如:
<syntaxhighlight lang=FORTRANfixed>
<syntaxhighlight lang=FORTRANfixed>
* DO loop example.
* DO loop example.
第122行: 第122行:


=== 1960: COBOL ===
=== 1960: COBOL ===
[[COBOL]]在多努力之下,在1959年终正式格式化。他使用PERFORM 动词,而PERFORM动词有很多功能,像是后来加上的"结构化"的语法,像是 END-PERFORM。忽略宣告和初始化数的必要,类似for圈的语法为:
[[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]] 中的圈有称为 for-next圈。
[[BASIC]] 中的圈有称为 for-next圈。


<syntaxhighlight lang="freebasic">
<syntaxhighlight lang="freebasic">
第147行: 第147行:
</syntaxhighlight>
</syntaxhighlight>


''LEAVE'' 指令可以用来结束圈,像c语言的break,而''ITERATE''像continue。
''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圈 <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>
他的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>
个程式碼 <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语言的三个参数的圈,并且支援break和continue。
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>
参考<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" *)