当循环条件为true时,while循环会一直执行循环体。当循环条件变为false时,while循环则结束,程序继续执行循环体之后的语句。如果一开始循环条件即为false,循环体不会被执行。

如上图所示,你可以使用while循环来循环特定轮数。然而,通常情况下在使用while循环时并不知道循环会被执行多少次。你可以用while循环来处理字符串。谷歌一直在扫描旧书并用软件识别扫描的文本。但是软件可能会把l当成1。以下代码对字符串进行循环,将1替换回l。

public class Test
{
   public static void main(String[] args)
   {
     String message = "Have a 1ong and happy 1ife";
     int index = 0;

     // while more 1's in the message
     while (message.indexOf("1") >= 0)
     {
       index = message.indexOf("1");
       message = message.substring(0,index) + "l" + message.substring(index+1);
     }

     System.out.println(message);
   }
}

while循环从第9行开始,循环体则是第10行到第13行。对于Java而言,代码的缩进(每行前填充空格或制表符)对于定位循环体不是必须的,但这本身是一个很好的习惯。AP计算机考试主观题的阅卷者也会通过缩进来解读你的代码(即便你忘了花括号)。

while循环的一个重要注意事项是避免无限循环。无限循环的循环条件永远为true,因而不会停止。

// an infinite loop
while (true)
{
   System.out.println("This is a loop that never ends");
}

以上这个无限循环的例子非常显眼,但大多数无限循环都是无心之失,是程序员忘记修改导致循环条件变化的变量所造成的。

在循环中追踪变量

在循环中追踪变量是很重要的技能。你可以用一张草稿纸记录每轮循环后各变量储存的值,也可以用集成开发环境的调试功能做到这一点。比如对于以下代码:

public class Test
   {
      public static void main(String[] args)
      {
      
         int var1 = 3;
         int var2 = 2;
   
         while ((var2 != 0) && ((var1 / var2) >= 0))
         {
            var1 = var1 + 1;
            var2 = var2 - 1;
         }
      }
   }

草稿纸上的变量追踪可能是这样:

AP计算机考试中有一部分多项选择题需要通过这种方式来迅速准确的找到答案。

当然,你还可以使用System.out.println(variable)来直接打印出变量值。下面代码中,我们打印出循环开始前和每轮循环后的所有变量值。

public class Test
{
   public static void main(String[] args)
   {

      int var1 = 3;
      int var2 = 2;

      System.out.println("var1: " + var1 + " var2: " + var2);

      while ((var2 != 0) && ((var1 / var2) >= 0))
      {
         var1 = var1 + 1;
         var2 = var2 - 1;
         System.out.println("var1: " + var1 + " var2: " + var2);
      }
   }
}


0:00

What does the following code print?

int x = -5;
while (x < 0)
{
   x++;
   System.out.print(x + " ");
}
在循环体结尾处,x-4一直增加到0x = 0时循环结束。
3

What are the values of var1 and var2 when the code finishes executing?

int var1 = 0;
int var2 = 2;

while ((var2 != 0) && ((var1 / var2) >= 0))
{
   var1 = var1 + 1;
   var2 = var2 - 1;
}
由于短路求解,&&后接的第二个条件在第一个已经为false时不会被执行。
2

What are the values in a after multAll(3) executes?

private int[ ] a = {1, 3, -5, -2};

public void multAll(int amt)
{
   int i = 0;
   while (i < a.length)
   {
      a[i] = a[i] * amt;
      i++;
   } // end while
} // end method
循环会让每个元素乘3
2

What are the values in a after mult(2) executes?

private int[ ] a = {1, 3, -5, -2};

public void mult(int amt)
{
   int i = 0;
   while (i < a.length)
   {
      a[i] = a[i] * amt;
   } // end while
} // end method
因为循环体里没有更改循环条件涉及的变量i,造成了无限循环。
4


陈 欣

AADPS创始人

发表评论