这个问题在这里已有答案:
我知道分号需要用分号结尾,就像在这段代码中一样:
public class Main{
public static void main(String[] args){
System.out.println("blah blah blah and stuff")
}
}
在println语句的末尾需要分号,否则程序将无法编译。
最近,我偶然在println语句的末尾放了两个分号:
System.out.println("blah blah blah and stuff");;
我注意到了,所以我开始在我的程序中放置分号
public class Main{;;;;;;
public static void main(String[] args){;;;;;;;;
System.out.println("blah blah blah and stuff");;;;;;
};;;;;;
};;;;;
此代码编译,打印字符串,没有错误或意外结果。我已经搜索了为什么编译器似乎只是忽略了这些分号,但从未找到任何特别提及的内容。那么,为什么这些分号不会产生语法错误?
这被称为empty statement,它是有效的。
空语句什么都不做。
它没有太多用途
while (checkCondition()) // may have some side effects
;
分号用于终止表示语句结束的语句
所以当你说
int i=5;
;
它只是意味着这是一个空洞的陈述。虽然没有使用它,但它不被视为错误,因为它只是表示空的语句结束。
这就是编译器的工作原理。
当编译器编译你的代码时,它遵循一些称为Context Free Grammar的规则,它对不同的语言有不同的定义。
在C编程语言中,可能存在诸如的规则
声明 - >(optional_other_stuff)+';'
这意味着每个语句必须以分号结尾。
换句话说,缺少分号会使编译器无法识别该语句,但额外的分号仅被视为编译器的空语句
它的empty statement
,当你编译它时,它将被删除。
所以它没有任何区别。