2015-10-06 56 views
1

这段代码工作为什么变量在“;”之后未被识别在Java中

public static void main(String[] args) { 
//print from 1-100 

    for (int i = 0; 
     i < 100; 
     i ++) 
    { 
    System.out.print(i + "\n "); 
    } 
} 

但是这一次没有。

public static void main(String[] args) { 
//print from 1-100 
    for (int i = 0; 
     i < 100; 
     i ++);  // Why does ; stop i from being recognized? 
    { 
    System.out.print(i + "\n "); 
    } 
} 

为什么将停止变量;i++)System.out.print(i + "\n ");被认可?

这是Java独有的吗?

+0

可能重复的[我不能解析为一个变量,我正在写一个Java程序,它将字符串作为参数反转](http://stackoverflow.com/a/32665527/3841803) – silentprogrammer

+1

将一个分号后你的循环意味着你以后没有身体。这意味着'i'不再在范围中定义。 –

+0

可能重复的[我不能解析为一个变量。我正在写一个Java程序,将字符串作为参数反转](http://stackoverflow.com/questions/32665469/i-cannot-be-resolved-to-a -variable-i-am-writing-a-java-program-which-reverses-a) – Tom

回答

12

额外;在端部是指在for循环变成这样:

for(int i = 0; i < 100; i++) { 
    //Empty 
} 

因此,在这种片的代码:

{ 
System.out.print(i + "\n "); 
} 

i超出范围并且不能被识别,因为你的代码基本上是这样的:

for (int i = 0; 
    i < 100; 
    i ++)  // Why does ; stop i from being recognized? 
{/*FOR LOOP*/} 
{ 
System.out.print(i + "\n "); //i is out of scope here. 
} 
+1

@Tom:谢谢。固定。 – npinti

0

没有一个for循环在Java中定义了很多其他语言如:

BasicForStatement: 
for (ForInitializer? ; ForConditionExpression? ; ForPostExpression?) Statement 

这个语句可以是一个块,就像这样:

for(...){ 
    ... 
} 

或独立声明。一个孤独的;被解释为禁止使用声明。因此:

for (int i = 0; 
    i < 100; 
    i ++); // <-- statement that executes in the for-loop 
{ // <-- this block doesn't belong to the for-loop 
System.out.print(i + "\n"); 
} 

由于在块中的代码然后不属于环路,i不在范围。

+0

你说的表达,但你可能意味着声明 - 他们不是一回事。 – skeggse

+0

@skeggse sry,我有时会把它们混淆 – Paul

+0

不用担心,我的评论很简短,但并不是简单的。 – skeggse

0

你的循环是

for (int i = 0; i < 100; i ++) 
     ; 

相当于您可以避免花括号在for循环(但是是不好的做法),如果你只有一个语句来执行进入循环。

如果添加大括号,你有:

for (int i = 0; i < 100; i ++) { 
    ; 
    System.out.print(i + "\n "); 
} 

正如你可以看到你有一个单一的;这是一个NOP指令的等价物。但是进入循环,所以花括号之间的所有内容都将被执行。

给你一点提示:以更好的方式格式化你的代码,以清晰的方式查看发生了什么。