For循环使用布尔值而不是变量初始化

时间:2014-01-03 20:16:56

标签: java variables for-loop boolean

我有这个代码片段:

private static int counter = 0;

public static void main(String[] args) {
    int x = 1;

    for (test('1'); test('2') && (x <= 2); test('3'))
    {
        x++;
        test('4');
    }

    System.out.println(" Counter=" + counter);
}

static boolean test(char num)
{
    System.out.print(" " + num);
    counter++;
    return true;
}

为什么for循环在这里做?我认为for循环中的第一个语句必须是变量的初始化,并且这不会编译,但它会运行并输出输出:

 1 2 4 3 2 4 3 2 Counter=8

boolean在这做什么?

2 个答案:

答案 0 :(得分:6)

“初始化”语句(本例中为test('1'))可以是任何语句列表(参见下面的JLS链接);它不需要实际初始化。

条件test('2') && (x <= 2)将在每次循环迭代之前按照惯例进行评估,直到它变为false。每次迭代后都会执行增量test('3')

详见JLS §14.14.1


让我们手工完成它:

  1. 第一次迭代:
    • test(1)致电
      • 1已打印,counter设为1
    • 条件test('2') && (x <= 2)已执行
      • 2已打印,counter设为2
      • 条件返回true
    • x++x设置为2
    • test(4)致电
      • 4已打印,counter设为3
    • 增加test('3')来电
      • 3已打印,counter设为4
  2. 第二次迭代:
    • 条件test('2') && (x <= 2)已执行
      • 2已打印,counter设为5
      • 条件返回true
    • x++x设置为3
    • test(4)致电
      • 4已打印,counter设为6
    • 增加test('3')来电
      • 3已打印,counter设为7
  3. 第三次迭代:
    • 条件test('2') && (x <= 2)已执行
      • 2已打印,counter设为8
      • 条件返回false,因为x现在为3

答案 1 :(得分:0)

这是一个有效的for循环,所以它可以正常工作
它有(初始化,终止,增量)部分
这三个可以是几乎任何有效的表达(几乎) 1)终止需要布尔
2)初始化增量可以是任何表达式列表

以下是for循环语法的非正式描述。

http://docs.oracle.com/javase/tutorial/java/nutsandbolts/for.html

有关更正式的说明,请查看JLS。