-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);
     }
   }

输出是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

结果令人难以置信。为什么这个添加的分号会如此显着地改变我的程序的含义?

4

6 回答 6

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);
     }
   }
于 2012-08-28T04:38:06.507 回答
7

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

以另一种方式编写它以使其更易于查看:

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

{
    count++;
}

with 块变成了带有单个语句的裸块,由于分号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来查找 a 中空格字符的第一个索引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 ' '
于 2012-08-28T04:39:41.090 回答
3

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

这会导致count++它在通过时只执行一次,而不是在循环结束时执行 100 次。

于 2012-08-28T04:38:49.520 回答
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);
     }
   }
于 2012-08-28T04:40:17.627 回答
1

分号是一个空语句,它是一个有效的语句。您当前的循环仅针对该“空语句(;)起作用,因此您看不到count与循环有关的任何变化。

在循环之后,语句count++被执行一次,因此您会看到结果“1”。如果未指定循环体,则循环{ }后的第一条语句被视为循环的一部分。在您的第二种情况下,它是空语句。

它相当于:

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

count++;
于 2012-08-28T04:42:11.557 回答
0

迭代结束后,您正在增加计数值

在 for 循环之后,您使用分号,因此您的 for 循环结束

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

{计数++; }

count increment 不在 for 循环中。它在循环之外;

于 2012-08-28T04:38:16.970 回答