9

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

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

4 回答 4

21

多余的分号被视为空语句。空语句什么都不做,所以这就是 Java 不抱怨它的原因。

于 2012-05-08T02:27:16.580 回答
18

正如 Jake King 所写,您可以生成空语句以在循环中不执行任何操作:

while (condition);

但为了清楚起见,你会写

while (condition)
    ;

甚至更好:

while (condition)
/** intentionally empty */
    ;

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

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

更多的时候,你会在 for 语句中看到它的无限循环:

for (;;)

或只有一个空语句

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

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

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

编译它,并运行列出字节码的大小(相同)并对字节码(相同)执行 md5sum。

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

于 2012-05-08T02:38:48.370 回答
7

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

while (condition);

这将循环直到condition为假,阻止代码继续进行。但是,这在现代代码中是不鼓励的,并且不应该在 Java 中真正使用。但是,空语句确实算作语句,只是无用的语句,因此构造如下:

if (condition);
    doSomething();

....可能会导致有些莫名其妙的结果。该if语句将调用空语句,而不是方法,因此将始终调用该方法。只是要记住一个警告。

于 2012-05-08T02:30:57.513 回答
0

需要注意的一件事是,如果您执行以下操作:

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

编译器将/可能会抱怨无法访问的语句,因为返回后有一个空语句。至少在 Oracle 的 1.6 sdk 中是这样。

于 2012-05-12T16:51:58.360 回答