for循环中错误的分号

时间:2015-05-27 14:06:57

标签: java for-loop

当我完成作业时,我通过放置一个小错误;在for循环中,如下面的代码。

for(i=0;i<n;i++);{
    n=n*i;
}

当我编译程序时,它编译时没有错误,但我没有得到输出一段时间。后来发现我在for循环中放错了分号。在循环之后我放置分号时的错误是什么。

class A
{
    public static void main(String args[])
    {
        int i, n=1;
        for(i=1; i<=5; i++);
        n=n*i;
        System.out.println(n);
    }    
}

我得到以下代码的输出为6而不是120。

5 个答案:

答案 0 :(得分:3)

执行此操作时:for(i=0;i<n;i++);您基本上是这样做的:for(i=0;i<n;i++) {}。这转化为没有身体的循环。

while循环也会发生这种情况:while(..);{<Foo>}。额外的;只会执行一次。

if语句也是如此。由于同样的原因,执行if(a==b);{<Foo>}仍会执行<Foo>。如果a == b,那么将考虑空语句。之后,<Foo>将被执行。这可能会给人一种错误的印象,即Java会将false视为true,因为如果a != b,则仍会执行<Foo>

答案 1 :(得分:1)

for循环只能执行一个代码块或一个语句,甚至是空语句。所以这里的分号代表空语句(什么都不做的语句)。

换句话说,您可以将for(int i; i<n; i++);视为for(int i; i<n; i++){}

代码如

for(int i; i<n; i++);{
    foo();
}

相同
for(int i; i<n; i++){
    //do nothing, except i++
}
//after loop finishes 
{
    foo();
}

for(int i; i<n; i++);
    foo();

就是

for(int i; i<n; i++){
}
foo();

关于

int i, n=1;
for(i=1; i<=5; i++);
n=n*i;
System.out.println(n);
     

我得到以下代码的输出为6而不是120。

如前所述,您的代码

for(i=1; i<=5; i++);
n=n*i;

相同
for(i=1; i<=5; i++){}
n=n*i;

这意味着你的循环不会执行n=n*i但会尝试执行{}而不执行任何操作。同样在每次迭代结束时i会因i++而递增,所以当i成为5时你的i<5将会是错误的控制流将离开循环并执行n=n*5,这意味着n将变为n=1*5 5

如果您希望通过在每个循环中执行120来获得结果n=n*i,只需在循环后删除分号。

for(i=1; i<=5; i++)//<--removed semicolon
    n=n*i;

BTW更喜欢在代码块中放置应由循环或if语句执行的代码,

for(i=1; i<=5; i++){
    n=n*i;
}

这使您的代码更易于阅读和维护。此外,如果你再次犯错,你将使用一些自动格式化工具,它将为你缩进代码,你会发现它将被格式化为

for(i=1; i<=5; i++)
    ;
{
    n=n*i;
}

可以很容易地发现这些错误。

答案 2 :(得分:0)

如果在for循环之后放置分号,那么它在技术上是正确的语法。因为它被认为是一个空语句 - 这意味着什么都不执行。

在你的情况下 -

for(i=0;i<n;i++);  

执行最多n次的空语句。或者换句话说,for-loop只运行n次。

for循环后的花括号{}只执行一次。现在大括号{}内的代码块被视为floating block

答案 3 :(得分:0)

你没有得到输出,因为分号结束了语句,[for(I = 0; I&lt; n; I ++]

代码应为:

for(i=0;i<n;i++) {
     n=n*1;
}

答案 4 :(得分:0)

你得到6的原因很简单。在最后一次迭代中,i的值从5变为6,循环将不再进行另一次迭代,因为i = 6并且它不再满足for loop的条件。由于n = 1且i = 6,因此n * i的输出为6。