当我完成作业时,我通过放置一个小错误;在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。
答案 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。