Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么带有连续分号的代码要编译?_Java - Fatal编程技术网

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

Java 为什么带有连续分号的代码要编译?,java,Java,根据我的科学Java实验,intx=0相当于intx=0相当于intx=0 为什么Java允许这样做?它有实际应用吗 这些都是空话吗?它们在运行时是否真的占用了额外的处理时间?(我想他们只是被优化了?) 其他语言也能做到这一点吗?我猜这是从C语言继承下来的东西,就像Java中的很多东西一样。这是真的吗 额外的分号被视为空语句。空语句不起任何作用,所以Java不会抱怨它。是的,它们是空语句,根本不起任何作用。编译器对它们进行了优化,但在某些情况下,这个空语句实际上做了一些事情,与一组空大括号({}

根据我的科学Java实验,
intx=0
相当于
intx=0相当于
intx=0

  • 为什么Java允许这样做?它有实际应用吗
  • 这些都是空话吗?它们在运行时是否真的占用了额外的处理时间?(我想他们只是被优化了?)
  • 其他语言也能做到这一点吗?我猜这是从C语言继承下来的东西,就像Java中的很多东西一样。这是真的吗

  • 额外的分号被视为空语句。空语句不起任何作用,所以Java不会抱怨它。

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

    while (condition);
    
    这将循环直到
    条件
    为false,从而阻止代码继续进行。然而,这在现代代码中是不被鼓励的,并且不应该在Java中真正使用。但是,空语句不算作一个语句,只是一个无用的语句,因此构造如下:

    if (condition);
        doSomething();
    
    public int foo()
    {
        return(0);;
    }
    

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

    正如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编译器,我可以这么说

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

    if (condition);
        doSomething();
    
    public int foo()
    {
        return(0);;
    }
    

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

    +1,但我很确定编译器会优化(删除)空语句。@Jeremy不是这样,空语句保留在其中,因为它们实际上做了一些事情。从技术上讲,他们算是陈述,他们什么也不做。这不同于完全删除语句本身,编译产生完全相同的字节码(除了类名)。
    while结尾的分号(true)不是空语句。它终止了while循环,没有一个块。@Jeremy,这很公平。看来我错了。诚然,我不知道我从哪里得到这些信息,但在某处,有人提供了虚假信息。哦,好吧。@Jeremy我没有,如果听起来像是我的话,很抱歉。谢谢你的更正。:)我想不出一种语言不允许空语句(只要一开始就可以编写它们。)@trutheality,Ada不允许空语句。要显式指示空语句,请编写“null”。参见示例。C甚至可以执行
    while(条件)也作为语句执行。在极少数情况下,需要一个空的while循环语句块,我发现最好将其作为
    while(condition){}
    的某种化身来编写,而不是
    while(condition)(插入注释是另一种很好的方法)。分号很容易被忽略,但大括号是显式的。此外,虽然我不会说不要使用语言特性,因为有人可能不知道它,但一个看似错误的语句终止符是一个心理障碍,为了便于理解代码,通常最好避免使用它。