当前位置: 首页 > 知识库问答 >
问题:

为什么要编译带有连续分号的代码?

仇航
2023-03-14

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

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

共有3个答案

杨曜瑞
2023-03-14

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

while (condition);

这将循环直到条件为false,从而阻止代码继续进行。然而,这在现代代码中是不受鼓励的,并且永远不应该在Java中使用。然而,空语句确实算作一条语句,只是一条无用的语句,因此构造如下:

if (condition);
    doSomething();

。。。。可能会导致一些令人困惑的结果。if语句将调用空语句,而不是方法,因此将始终调用方法。只是要记住一个警告。

湛铭
2023-03-14

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

while (condition);

但为了说明这一点,你会写

while (condition)
    ;

甚至更好:

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

甚至更好,正如迈克尔·科林在评论中指出的那样,

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

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

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

董谦
2023-03-14

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

 类似资料:
  • 问题内容: 为什么要编译Python脚本?您可以直接从.py文件运行它们,并且效果很好,那么在性能上有什么优势吗? 我还注意到,我的应用程序中的某些文件被编译为.pyc,而另一些则没有,为什么? 问题答案: 它被编译为字节码,可以更快,更快速地使用。 无法编译某些文件的原因是,每次运行脚本时都会重新编译与之一起调用的主脚本。所有导入的脚本将被编译并存储在磁盘上。 Ben Blank的 重要补充:

  • 问题内容: 在方法或类范围内,下面的行进行编译(带有警告): 在类范围中, 变量获取其默认值 ,以下给出“未定义引用”错误: 它不是第一个应该以相同的“未定义参考”错误结束吗?还是第二行应该编译?还是我缺少什么? 问题答案: tl; dr 对于 字段 ,是非法的,因为它是对的非法前向引用。您实际上可以通过编写来解决此问题,该文件可以毫无抱怨地进行编译。 对于 局部变量 ,是非法的,因为未在使用前进

  • 在方法或类范围内,下面的行编译(带有警告): 在类作用域中,变量获取其默认值,以下给出未定义引用错误: 这难道不是第一个应该以相同的未定义引用错误结束吗?或者第二行应该编译?或者我错过了什么?

  • 问题内容: 这段代码使我凝视了几分钟: 我以前从未见过,而且我也不知道Java有一个“ loop”关键字(NetBeans甚至没有像关键字一样给它上色),并且它在JDK 6中可以很好地编译。 有什么解释? 问题答案: 这不是一个。 用法:

  • 问题内容: 我正在使用Ubuntu 14.04 64位。这是我的C ++代码,以了解如何使用内存。 这是我的输出: 我希望操作系统会连续分配内存。因此,ptr [0] [0]将位于0x1195020而不是0x1195030!OS在0x1195020-0x119502F,0x1195038-0x0x119504F上做什么用? 问题答案: 因为: 在分配的内存的每个块的开始和结尾处都有一些空间通常用于

  • 我试图理解Scala代码如何在Java的IDE中与Java一起工作。我在使用Spark Java时遇到了这个疑问,在Spark Java中,我看到Scala包也在代码中,并且使用了相应的类和方法。 我的理解是,Scala代码需要Scala的编译器转换成Java.class文件,然后从它们开始JDK在JVM中完成它的部分,转换成二进制文件并执行操作。如果我说错了,请指正。 之后,在eclipse中的