For循环
for 循环的种类
传统的 for 循环 for-loops
C语言中传统的for-loop包含三个部分:初始化、条件、递增,这三个部分都是可有可无的。
for(INITIALIZATION;CONDITION;AFTERTHOUGHT){// Code for the for-loop"s body goes here.}
初始化是宣告(或者赋值)任何需要的变数的动作。如果你要使用多个变数,则变数的种类要一致。条件的部分则是检查是否离开这个循环,也就是让程式码往下执行。如果条件判断为假,则离开循环。递增在每跑一次循环都会重复执行一次。 在此以Java为例:
for(inti=0;i<100;i++)// Prints the numbers 0 to 99 (and not 100), each separated by a space.{System.out.print(i);System.out.print(" ");}System.out.println();
使用指标的for循环
这种形式的for循环是大多数其他for循环的变革:他允许除了数字以外的计数方式。他通常用隐含或外显指标的方式呈现,而在此循环变数会依序表示。以下是一个代表性的例子(语言:Python):
foriteminsome_iterable_object:doSomethingdoSomethingElse
矩阵化for循环
有一些语言支援比较特别的for循环,如同它可以同时处理所有的指标in parallel,像是在FORTRAN 95中的for all语法。 举例来说,在以下的for循环虚拟码片段,当计算A(i)的新的值,除了第一个(也就是 i = 2),A(i - 1)的参照会得到新的值。 然而,在for all 版本,每个计算都会使用一开始的值,不会更改 A.
和一般的for循环可能差距比较大。
应用范例
以c语言为例:
作为死循环
for(;;)printf("just keep going on!");
这个程式码会不断的印出"just keep going on!"。
配合矩阵
矩阵赋值:
for(inti=0;i<bound_of_matrix;i++)matrix[i]=i;
以上给予矩阵 matrix 依序从0到bound_of_matrix-1 的值。
巢状循环
就像巢穴一样,一层包覆一层,所以以下这个程式码一共会执行(bound_of_x)乘上(bound_of_y)次。
for(inti=0;i<bound_of_x;i++)for(intj=0;j<bound_of_y;j++)matrix[i][j]=j;
常见的错误
死循环
这里指的是无意产生的死循环,容易导致当机
for(inti=0;i<10;i--)printf("confused");
超出界线
编译器会显示out of bound,通常是指尝试取矩阵界线外的值。
循环内的变数
循环内的变数在出循环之后,便无法使用。
不同语言的For循环
BASH
for((i=1; i <=5; i++ ))doecho$i# just print value of idone
C语言
for(counter=1;counter<=5;counter++)//statement;
C++语言
1 for(i=0;i<3;i++)
FORTRAN
do counter=1,5,1write(*,"(i2)")counterend do
JAVA
for(inti=0;i<5;i++){//循环语句;}
Lua
fori=1,5,2doprint(i)end
PHP
for($i=0;$i<5;$i++){# statements;}
VB
Fori=1To5===PASCAL===fornoti=1dobegini=0;writeln("Go on!");end."循环语句Nexti
C / C++ / Java / C#代码:
intj=5,x=0;for(inti=1;i<=j;++i){++x;j=1;}// x的值为1
VB代码:
DimjAsInteger=5,xAsInteger=0Fori=1tojx=x+1j=1Nexti" x的值为5
发展概论
主要缘起为许多需要重复执行的程式码,而不一样的编程语言也会有不一样的语法型式。
1957: FORTRAN
在Fortran 的DO 循环 同等于for循环。 Fortran的 DO 循环语法为:
DO labelcounter=first,last,stepstatementslabelstatement
接下来的两个例子做出来的结果等同于其他语言的三个参数的for循环。其中变数COUNTER被初始化为1,以1递增,并且到5的时候停下。
DO 9,COUNTER=1,5,1WRITE(6,8)COUNTER8FORMAT(I2)9CONTINUE
Fortran 77 获之后的版本,也可能写成:
do counter=1,5write(*,"(i2)")counterend do
如果递增为1,则递增的部分可以省略。例如:
* DO loop example.PROGRAM MAINSUM SQ=0DO 199I=1,9999999IF(SUM SQ.GT.1000)GOTO200199 SUM SQ=SUM SQ+I**2200 PRINT 206,SUMSQ206 FORMAT(I2)END
1958: Algol
Algol在Algo158首次正式格式化。
1960: COBOL
COBOL在许多努力之下,在1959年终正式格式化。他使用PERFORM 动词,而PERFORM动词有很多功能,像是后来加上的"结构化"的语法,像是 END-PERFORM。忽略宣告和初始化变数的必要,类似for循环的语法为:
PERFORMVARYINGIFROM1 BY1 UNTILI>1000ADDI**2 TOSUM-SQ.END-PERFORM
如果PERFORM有TEST AFTER,这个循环的执行的结果会有点不同:循环内的程式会被执行至少一次。
1964: BASIC
BASIC中的循环有时称为 for-next循环。
ForI=1to5;PrintI;NextI
1964: PL/I
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
forCounter:=1to5do(*statement*);
1972: C/C++
更多资料:C syntax#Iteration statements
for(initialization;condition;increment/decrement)statement
1972: Smalltalk
1980: Ada
forCounterin1..5loop-- statementsendloop;
1980: Maple
Maple有两种型式的for循环,一个是指标一定范围的值,另一个是指标一定大小的容器。 第一种:
第二种:
1982: PostScript
他的for循环 [initial] [increment] [limit] { ... } for 初始化一个内部的变数, 并且执行到他不大于限制的值(若递增为负则以此类推)。
116{STATEMENTS}for
1983: Ada 83 and above
procedureMainisSum_Sq:Integer:=0;beginforIin1..9999999loopifSum_Sq<=1000thenSum_Sq:=Sum_Sq+I**2endif;endloop;end;
1984: MATLAB
fori=1:5--statementsend
1987: Perl
for($counter=1;$counter<=5;$counter++){# implictly or predefined variable# statements;}for(my$counter=1;$counter<=5;$counter++){# variable private to the loop# statements;}for(1..5){# variable impicitly called $_; 1..5 creates a list of these 5 elements# statements;}statementfor1..5;# almost same (only 1 statement) with natural language orderformy$counter(1..5){# variable private to the loop# statements;}
1988: Mathematica
Do[f[x],{x,0,1,0.1}]
For[x=0,x<=1,x+=0.1,f[x]]
1989: Bash
*第一種 for i in 12345do# must have at least one command in loopecho$i# just print value of idone
*第二種 for((i=1; i <=5; i++ ))do# must have at least one command in loopecho$i# just print value of idone
1990: Haskell
forM_[1..5]$\indx->dostatements
如果你想要用更正式的方式存 [1..5]的内容,一个比较官方的方式为:
importControl.MonadasMforLoopM_::Monadm=>a->(a->Bool)->(a->a)->(a->m())->m()forLoopM_indxpropincrf=dofindxM.when(propnext)$forLoopM_nextpropincrfwherenext=incrindx
并且可以这样使用:
forLoopM_(0::Int)(do-- whatever with the index
1991: Oberon-2, Oberon-07, or Component Pascal
FORCounter:=1TO5DO(* statement sequence *)END
1991: Python
forcounterinrange(1,6):# range(1, 6) gives values from 1 to 5 inclusive (but not 6)# statements
1993: AppleScript
repeatwithifrom1to5-- statementslogiendrepeat
1993: Lua
fori=start,stop,intervaldo-- statementsend
这个程式码
fori=1,5,2doprint(i)end
即会印出:
135
1995: Java
for(inti=0;i<5;i++){//perform functions within the loop;//can use the statement "break;" to exit early;//can use the statement "continue;" to skip the current iteration}
1995: JavaScript
JavaScript 支援像是C语言的三个参数的循环,并且支援break和continue。
for(vari=0;i<5;i++){// ...}
1995: PHP
for($i=0;$i<=5;$i++){for($j=0;$j<=$i;$j++){echo"*";}echo"";}
1995: Ruby
forcounterin1..5# statementsend5.timesdo|counter|# counter iterates from 0 to 4# statementsend1.upto(5)do|counter|# statementsend
1996: OCaml
请参考
(* for_statement := "for" ident "=" expr ( "to" ∣ "downto" ) expr "do" expr "done" *)fori=1to5do(* statements *)done;;forj=5downto0do(* statements *)done;;
1998: ActionScript 3
for(varcounter:uint=1;counter<=5;counter++){//statement;}
相关条目
Foreach循环
免责声明:以上内容版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。感谢每一位辛勤著写的作者,感谢每一位的分享。
- 有价值
- 一般般
- 没价值