为什么连续分号的代码会编译?

Tim*_*Tim 9 java

根据我的科学Java实验,int x = 0;相当于int x = 0;;相当于int x = 0;;;;;;;;;;;;;;;

  1. 为什么Java允许这样做?它有什么实际应用吗?
  2. 这些都是空洞的陈述吗?他们实际上是否在运行时占用了额外的处理时间?(我会假设他们刚刚优化了?)
  3. 其他语言是这样做的吗?我猜它是从C继承的东西,就像Java中的很多东西一样.这是真的?

Jor*_*ias 22

额外的分号被视为空语句.空语句什么都不做,所以这就是为什么Java不会抱怨它.


use*_*own 18

正如Jake King所写,你可以产生空语句,在循环中什么都不做:

while (condition);
Run Code Online (Sandbox Code Playgroud)

但要明白,你会写

while (condition)
    ;
Run Code Online (Sandbox Code Playgroud)

甚至更好:

while (condition)
/** intentionally empty */
    ;
Run Code Online (Sandbox Code Playgroud)

甚至更好,正如MichaelKjörling在评论中指出的那样,

while (condition)
{
    /** intentionally empty */
}
Run Code Online (Sandbox Code Playgroud)

更常见的是,您在for语句中看到无限循环:

for (;;)
Run Code Online (Sandbox Code Playgroud)

或只有一个空的陈述

for (start;;) 
for (;cond;) 
for (;;end) 
Run Code Online (Sandbox Code Playgroud)

你可以做的另一件事是,编写一个程序,一个用一个,一个用2个分号:

public class Empty
{
    public static void main (String args[])
    {
        System.out.println ("Just semicolons");;
    }
}
Run Code Online (Sandbox Code Playgroud)

编译它,并运行列表字节代码的大小(identic)并在字节码(identic)上执行md5sum.

因此,在没有改变语义的情况下,它显然已经被优化了,至少对于1.6-Oracle编译器我可以这么说.


Ale*_*ing 8

是的,它们是空的陈述,根本不做任何事情.它们由编译器优化,但在某些情况下,这个空语句实际上做了一些事情,做了一组空括号({}).它们继承自C语法,但它们在Java中几乎没有用处.在C中,有时做这样的事情很有用:

while (condition);
Run Code Online (Sandbox Code Playgroud)

这将循环直到condition为false,从而阻止代码进行.但是,这在现代代码中是不鼓励的,并且不应该真正用于Java.但是,空语句确实算作一个语句,只是一个无用的语句,所以构造如下:

if (condition);
    doSomething();
Run Code Online (Sandbox Code Playgroud)

....可能会导致一些莫名其妙的结果.该if语句将调用空语句而不是方法,因此将始终调用该方法.请记住一点需要注意.

  • 编译[这两个类](https://www.refheap.com/paste/2645)会产生完全相同的字节码(类名除外).`while(true);`末尾的分号不是空语句.它在没有块的情况下终止while循环. (3认同)