为什么这些分号不会产生错误?

时间:2014-03-08 17:20:19

标签: java syntax

我知道需要分号才能结束语句,就像在这段代码中一样:

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

此代码编译,打印字符串,没有错误或意外结果。我已经搜索了为什么编译器似乎只是忽略了这些分号,但从未找到任何特别提及的内容。那么,为什么这些分号不会产生语法错误?

4 个答案:

答案 0 :(得分:8)

这被称为empty statement,它是有效的。

  

空语句什么都不做。

它没有多少用途

while (checkCondition()) // may have some side effects
    ;

答案 1 :(得分:2)

分号用于终止表示语句结束的语句

所以当你说

int i=5;
;

它只是意味着这是一个空的陈述。虽然没有使用它,但它不被视为错误,因为它只是表示一个空的语句结束。

答案 2 :(得分:1)

这就是编译器的工作原理。

当编译器编译你的代码时,它遵循一些叫做Context Free Grammar的规则,它对不同的语言有不同的定义。

在C编程语言中,可能存在诸如

之类的规则

声明 - > (optional_other_stuff)+';'

表示每个语句必须以分号结尾。

换句话说,缺少分号会使编译器无法识别该语句,但额外的分号仅被视为编译器的空语句

答案 3 :(得分:0)

empty statement,当您编译该类时,它将从中删除。

所以没有区别。