欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

51.Java循环

程序员文章站 2022-04-29 11:28:58
...

循环语句的功能是在循环条件满足的情况下,反复执行一段代码,直到不再满足循环条件为止。

 

这个类型的工作恐怕是现在计算机最适合去做的事情之一了。无论哪个人在勤恳,重复做同样一件事情总是会新生倦怠的,这是谁也避免不了的。并且还不能保证重复做得每一次都是保证同样的质量和结果。

 

但是计算机就不同了,或者说机器就是不同了,它们非常适合做这类重复性的活动。

 

循环语句一般由下述四部分组成:
初始化部分(init_statement):一条或多条语句,用来做一些初始化工作,例如设置计数器初值等;

循环条件部分(test_exp):这是一个boolean类型的表达式,根据它的值来判断是否继续进行下一次循环;
循环体部分(body_statement):将被循环执行的目标代码,可以是一条语句,也可以是一个语句块;
迭代部分(alter_statement):在一次循环结束后,下一次循环开始前执行的语句,通常用于修改循环计数器的值。


循环语句使语句或块的执行得以重复进行。

 

Java编程语言支持三种循环构造类型:for, while和do while。三种循环结构均通过一个条件表达式来控制。

 

在while()和for()结构中,条件判断均先于语句块执行,所以,有可能语句块一次也不执行。


在do…while()中,语句块先于条件判断,所以,语句块至少执行一次。

 

这里先来看for循环的使用。

 

for语句的基本格式如下:
  for ( init_expr ; boolean test_expr ; alter_expr){
   statement or block;
  }


其中:init_expr表示初始化代码,而test_expr是用于条件判断的表达式,如果表达式的值为true,则执行后面的语句,接下来进行后面的步进代码alter_expr。如果条件判断表达式test_expr第一次求值就为false,那么for循环不会进行任何的迭代,后面的statement也不会进行任何的操作。


程序执行遇到for语句时,首先执行初始化部分(init_statement)的语句,然后计算循环条件表达式test_exp的值,如为true,则执行循环体部分的语句(body_statement),否则结束循环。


一次循环结束后,下一次循环开始前,执行迭代部分的语句(alter_statement),然后判断循环条件表达式test_exp的值,决定是否进行下一次循环。


请看下面这个for循环的例子:
 int result = 1;
 for (int k = 5;k>1;k--) {
  result = result * k;
 }


上面这个程序片断的作用是实现一个简单的阶乘运算:n*(n-1)*(n-2)*…*1,在这里,n的值为5,因此,它运算的结果是5*(5-1)*(5-2)*(5-3)*(5-4)=5*4*3*2*1=120。

 

上面的例子中,init_expr只有一个初始化的值,条件判断表达式也只有一个条件,步进代码也是每次递减一个数字。但是,其实Java允许在for语句的循环控制的各个部分放置任何表达式,如下例:
 for(int b = 0,s = 0,p = 0;(b<10)&&(s<4)&&(p<10);p++){
  //代码块
  //更新b和s 的值
 }


在这个例子中,初始化的变量有三个,但是,只能有一个声明语句,所以,如果需要在初始化表达式init_expr中声明多个变量,那么这些变量必须是同一种数据类型的。


for循环并没有限制在它的for语句的每一部分都必须提供一个表达式,这三个部分其实都可以为空,此时,是一个无限的循环。这在语法上是没有错误的,只是这种循环在实际应用中会引起很多的问题,我们应该避免这种会引起无限循环的for语句。

下面来看一个例子,来了解一下for语句中各部分为空时的控制情况:
 int sum=0;
 //注意看这个for语句,它的步进部分是空的
 for (int i=1;i<=n;){
  sum=sum+i;
  //将步进放到了for程序块中
  i++;
 }


注意这个for语句,它的步进部分是空的,我们将这个步进运算放到了程序块中。

 

一个无限for循环的例子如下:
 for(;;){
  //程序块
 }


这种情况一般是要避免的,我们不应该让程序出现这种无限循环的情况。

在for语句内定义的变量,它的作用范围仅限于for语句块、表达式以及for子句的语句部分。在for循环终止后,它们将不可被访问。如果需要在for循环外部使用循环计数器的值,可以将这个变量定义在for循环体外,如下:
 int k;
 for(k = 0;k<10;k++){
  //statements
 }


 //此时可以再使用变量k


另外,如果变量定义在for循环体内,则在另外一个循环体中还可以使用相同的变量名称,如下:
 for(int k=0;k<10;k++) {
  … …
 }
 
 for(int k = 100;k>0;k--) {
  … …
 }


上面的代码段是合法的。

 

 

while循环语句的格式:
 init_statement
 while ( boolean_expr ){
  statement or block;
  alter_expr;
 }


while语句首先测试boolean_expr表达式的值,如果为true,则运行代码块中的程序,并且一般需要进行迭代运算,以改变boolean_expr表达式中的变量的值,直到表达式中的值变为false。


如果刚开始条件表达式就为false,则while循环永远也不会被执行。


来看一个while循环的例子:
 … …
 //while循环
 int result1=0;
 int result2=0;
 //初始化一个变量
 int i=1;
 //利用这个变量构成一个条件表达式
 while(i<=10) {
  result1=result1+i;
  //将i加1
  i=i+1;
 }
 System.out.println("After the While Loop,the result1 is:"+result1);
 … …


for循环和while循环是等价的,我们可以将如下的for循环:
for(init_expr;test_expr;alter_expr){
 statements;
}


改写成如下的while循环方式:
init_expr;
while(test_expr){
 statements;
 alter_expr;
}

这两种方式是完全可以相互替换的。for循环和其他两个循环控制语句不同的地方在于,它可以在控制表达式中定义变量,而while/do…while不能这样做。