为什么在'for(...)之后添加分号会如此戏剧性地改变我的程序的含义?

时间:2012-08-28 04:36:30

标签: java

我写了以下课程:

  public class TestOne {
     public static void main(String[] args) {
        int count = 0;
        for (int i = 0; i < 100; i++) {
          count++;
        }
        System.out.println(count);
     }
   }

输出为100

然后我添加了一个分号:

    public class TestOne {
     public static void main(String[] args) {
        int count = 0;
        for (int i = 0; i < 100; i++); {     // <-- Added semicolon
          count++;
        }
        System.out.println(count);
     }
   }

输出为1

结果令人难以置信。为什么添加分号会大大改变我的程序的含义?

6 个答案:

答案 0 :(得分:8)

分号使for循环的主体变空。它相当于:

public class TestOne {
     public static void main(String[] args) {
        int count = 0;

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

        count++;
        System.out.println(count);
     }
   }

答案 1 :(得分:7)

这不是错误。分号成为for循环体内唯一的“语句”。

以另一种方式写下来,以便更容易看到:

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

{
    count++;
}

带有count++的块变为带有单个语句的裸块,由于分号,它与for循环完全无关。因此,此块及其中的count++仅在执行

这是语法上有效的java。 for (int i = 0; i < 100; i++);相当于:

for (int i = 0; i < 100; i++)
{ ; } // no statement in the body of the loop.
由于循环增量语句或终止条件中的副作用,此形式的

for循环可能很有用。例如,如果您想编写自己的indexOfSpace来查找String中空格字符的第一个索引:

int idx;

// for loop with no body, just incrementing idx:
for (idx = 0; string.charAt(idx) != ' '; idx++);

// now idx will point to the index of the ' '

答案 2 :(得分:3)

通过添加分号,您将声明没有块循环的for语句。

这导致count++仅在传递时执行一次,而不是在循环时执行100次。

答案 3 :(得分:1)

用分号表示for循环块结束,内部没有指令。

然后你只增加一次计数,这就是输出为1

的原因
public class TestOne {
     public static void main(String[] args) {
        int count = 0;
        for (int i = 0; i < 100; i++)  ; 

        {
          count++;
        }
        System.out.println(count);
     }
   }

答案 4 :(得分:1)

分号是一个空语句,是一个有效的语句。您当前的循环仅对该“空语句(;”起作用,因此您在count中没有看到关于循环的任何更改。

在循环之后,语句count++被执行一次,因此您看到结果为'1'。如果未使用{ }指定循环体,则循环后的第一个语句将被视为循环的一部分。在你的第二种情况下,它是空的陈述。

相当于:

for (int i = 0; i < 100; i++) 
      { 
       ; //any empty valid statement
      }

count++;

答案 5 :(得分:0)

在迭代结束后,您将递增计数值

在for循环之后,你使用了半冒号,所以你的for循环结束

for(int i = 0; i&lt; 100; i ++);

{           计数++;  }

计数增量不在for循环中。它在循环之外;