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

时间:2012-05-08 02:23:57

标签: java

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

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

4 个答案:

答案 0 :(得分:22)

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

答案 1 :(得分:18)

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

while (condition);

但要明白,你会写

while (condition)
    ;

甚至更好:

while (condition)
/** intentionally empty */
    ;
正如MichaelKjörling在评论中指出的那样,甚至更好,

while (condition)
{
    /** intentionally empty */
}

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

for (;;)

或只有一个空陈述

for (start;;) 
for (;cond;) 
for (;;end) 

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

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

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

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

答案 2 :(得分:8)

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

while (condition);

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

if (condition);
    doSomething();

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

答案 3 :(得分:0)

有一点需要注意的是,如果你这样做:

public int foo()
{
    return(0);;
}

编译器会/可能会抱怨无法访问的语句,因为返回后会有一个空语句。至少使用Oracle的1.6 sdk确实如此。