Java 使用布尔值代替变量初始化的For循环

Java 使用布尔值代替变量初始化的For循环,java,variables,for-loop,boolean,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=" + c

我得到了这个代码片段:

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循环,所以它工作正常。

它有(初始化、终止、增量)部分。

这三个表达式几乎可以是任何有效表达式。
1) 终止需要是布尔值
2) 初始化增量可以是任何表达式列表

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


有关更正式的说明,请检查JLS。
这是一个有效的For循环,因此它工作正常。

它有(初始化、终止、增量)部分。

这三个表达式几乎可以是任何有效表达式。
1) 终止需要是布尔值
2) 初始化增量可以是任何表达式列表

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

有关更正式的描述,请查看JLS。

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

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


条件
test('2')&&(x)for
初始化表达式的
不必是变量赋值;它可以执行任何必要的操作。即使(;;)
也是有效的。因为条件的计算结果为
True
,所以循环运行。
for(pre语句;boolean;post语句)
是for循环的用途。请注意,
test('1')
test('3')
的结果将被抛出。for
初始化表达式不必是变量赋值;它可以执行任何必要的操作。甚至
for(;;)
是有效的。因为条件求值为
True
,所以循环运行。
for(pre语句;boolean;post语句)
是for循环的作用。请注意,
test('1')
test('3')
的结果将被抛出。不是“任何一条语句”。它是一个语句列表。您链接的文档(当然,右边的一个)说,
ForInit
(可选)可以是一个
StatementExpressionList
,它是一个或多个
StatementExpression
,用逗号分隔。对于
ForUpdate
,OP的代码甚至可以是
for(test('1')、test('2')、test('3')&(x谢谢,我投了赞成票。)不过还是有点不准确:我不确定是否有“空白声明列表”这样的东西
ForInit
是可选的。它是由
LocalVariableDeclaration
StatementExpressionList
提供的。
StatementExpressionList
至少有一个
StatementExpression
。类似于
for(;…;…){…}没有一个空白语句表达式列表,它只是不提供一个<代码> FrimIT 。@ JojuaTayLor,是的,我认为你是对的。关于空白语句的一点在我的原始文章的上下文中更有意义;我将再次编辑。我刚才看到<<代码> FurnIT <代码>在语法中是可选的。而不是“任何单个语句”。。这是一个语句列表。您链接的文档(当然是右边的文档)说,
ForInit
(可选)可以是一个
StatementExpressionList
,它是一个或多个
StatementExpression
,用逗号分隔。这与
ForUpdate
是一样的。因此OP的代码甚至可以是
for(test('1')),test('2');test('3')&&(x谢谢,我投了赞成票。)虽然有点不精确:我不确定是否有“空白语句列表”这样的东西
ForInit
是可选的。它是由
LocalVariableDeclaration
StatementExpressionList
提供的。
StatementExpressionList
至少有一个
StatementExpression
。类似于
for(;…;…){…}没有一个空白语句表达式列表,它只是不提供一个<代码> FrimIT 。@ JojuaTayLor,是的,我认为你是对的。关于空白语句的一点在我的原始文章的上下文中更有意义;我将再一次编辑。我只是在语法中看到<<代码> FurnIT 是可选的。这是不正确的。s语法。第一部分(如果提供)是
LocalVariableDeclaration
(它不是表达式)或
StatementExpressionList
(一个或多个用逗号分隔的语句(如果多个))第三个是另一个
StatementExpressionList
。第二个必须是表达式,并且必须是
boolean
boolean
值表达式。它不能是“任何有效表达式”。@brunch875在Java中(5){/*…*}
时不能执行
;它是一个“无法从int转换为boolean”的表达式编译错误。@JoshuaTaylor他的观点是你可以用for循环来模拟它(比如(;5;){…})这就是我如何得到它的。但这也不能编译。好吧,很公平。@peter.petrov提供的链接似乎没有为
for
循环提供一般语法。它似乎只是非正式地描述了它们是如何使用的……这是不正确的。描述了语法。第一部分(如果提供)是
LocalVariableDeclaration
(它不是表达式)或
StatementExpressionList
(一个或多个语句用逗号分隔(如果多个语句))。第三个是另一个
StatementExpressionList
。但是,第二个必须是
 1 2 4 3 2 4 3 2 Counter=8