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

Phi*_*ger 1 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;
}
Run Code Online (Sandbox Code Playgroud)

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

 1 2 4 3 2 4 3 2 Counter=8
Run Code Online (Sandbox Code Playgroud)

这是boolean做什么的?

ars*_*jii 6

"initialization"语句(test('1')在本例中)可以是任何语句列表(参见下面的JLS链接); 它不需要实际上是初始化.

test('2') && (x <= 2)在每次循环迭代之前,将按照惯例评估条件,直到它变为假.增量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