为什么这些分号不会产生错误? [重复]

问题描述 投票:3回答:4

这个问题在这里已有答案:

我知道分号需要用分号结尾,就像在这段代码中一样:

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

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

java syntax
4个回答
8
投票

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

空语句什么都不做。

它没有太多用途

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

2
投票

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

所以当你说

int i=5;
;

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


1
投票

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

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

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

声明 - >(optional_other_stuff)+';'

这意味着每个语句必须以分号结尾。

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


0
投票

它的empty statement,当你编译它时,它将被删除。

所以它没有任何区别。

© www.soinside.com 2019 - 2024. All rights reserved.