我写了以下课程:
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
。
结果令人难以置信。为什么添加分号会大大改变我的程序的含义?
答案 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循环中。它在循环之外;