根据我的科学Java实验,int x = 0;
相当于int x = 0;;
which相当于int x = 0;;;;;;;;;;;;;;;
- 为什么Java允许这样做?它有实际应用吗?
- 这些都是空的陈述吗?它们实际上是否在运行时占用了任何额外的处理时间?(我会假设他们只是优化了?)
- 其他语言会这样做吗?我猜它是从 C 继承的东西,就像 Java 中的很多东西一样。这是真的?
根据我的科学Java实验,int x = 0;
相当于int x = 0;;
which相当于int x = 0;;;;;;;;;;;;;;;
多余的分号被视为空语句。空语句什么都不做,所以这就是 Java 不抱怨它的原因。
正如 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 编译器我可以这么说。
是的,它们是空的语句,根本不做任何事情。它们由编译器优化,但在某些情况下,这个空语句实际上做了一些事情,与一组空括号 ( {}
) 做同样的事情。它们继承自 C 语法,但在 Java 中很少使用。在 C 中,有时做这样的事情很有用:
while (condition);
这将循环直到condition
为假,阻止代码继续进行。但是,这在现代代码中是不鼓励的,并且不应该在 Java 中真正使用。但是,空语句确实算作语句,只是无用的语句,因此构造如下:
if (condition);
doSomething();
....可能会导致有些莫名其妙的结果。该if
语句将调用空语句,而不是方法,因此将始终调用该方法。只是要记住一个警告。
需要注意的一件事是,如果您执行以下操作:
public int foo()
{
return(0);;
}
编译器将/可能会抱怨无法访问的语句,因为返回后有一个空语句。至少在 Oracle 的 1.6 sdk 中是这样。