注释在运行时是否可以产生任何影响

Can comments make any difference during the run-time?

本文关键字:任何 影响 运行时 是否 注释      更新时间:2023-10-16

阅读我听到的最好的评论是什么?这条评论被投了201次:

很久以前,我不小心在Java3D中添加了一个segfault议论它具有100%的可重复性;如果我删除了评论,它坠毁。只要评论还在,它就很好。我想是的这是一个奇怪的时间问题,但我从来没有弄清楚到底是什么正在发生。

这可能吗?

如果他在Java3D中修复segfault,我猜他是在用Java或C/C++编写代码。我认为在这些语言中的任何一种语言中,评论都会在编译前被删除。。。

正如您所说,在Java中,注释不包括在编译的字节码中。例如,采用以下类:

public class test {
    public void methodWithoutComment() {
        System.out.println("This method does not have a comment");
    }
    public void methodWithComment() {
        // Method with comment
        System.out.println("This method has a comment");
    }
}

如果我们使用javapjavap -c test内省字节码,我们可以看到两种方法的字节码是相同的——除了输出到控制台的字符串:

public class test {
  public test();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return
  public void methodWithoutComment();
    Code:
       0: getstatic     #2                  // Field     java/lang/System.out:Ljava/io/PrintStream;
       3: ldc           #3                  // String This method does not have a comment
       5: invokevirtual #4                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V
       8: return
  public void methodWithComment();
    Code:
       0: getstatic     #2                  // Field java/lang/System.out:Ljava/io/PrintStream;
       3: ldc           #5                  // String This method has a comment
       5: invokevirtual #4                  // Method java/io/PrintStream.println:(Ljava/lang/String;)V
       8: return
}

我以为在任何一种语言中,评论都会被删除在编译之前。。。

看起来可能是这样,但不幸的是,这个看起来无害的Hello World程序甚至无法编译。

为什么?因为注释。罪魁祸首是的路径。具体地说,users。反斜杠后面跟着字母u,表示Unicode转义的开始。尾随的sers使其成为一个格式错误的Unicode转义。(如果u后面跟着4个十六进制数字,那也没关系——是的,即使在注释中也需要。)

因此,由于注释,代码甚至不会编译

public class HelloWorld {
    /**
     * Source: C:usersdevnullHelloWorld.java
     */
    public static void main(String[] args) {
        System.out.println("Hello World!");
    }
}

这里有两种解释。

第一,记者错了。他们没有进行他们认为正在进行的编辑,或者编译或执行错误,或者错误不稳定,偶然与他们的编辑相吻合,等等

第二,编辑删除了看起来像注释的内容,但实际上它与其他语法进行了交互。例如,考虑:

/* Start comment.
…
/* Not a new comment. */
… Some code here …
/* Sometimes a comment. */

当出现"Not a new comment"行时,"Some code here"是不属于注释的源代码。当"不是新注释"行不存在时,"此处的某些代码"就是注释的一部分。

别这么认为。为了运行Java程序,它应该编译成字节码,这样在编译过程中注释会被删除,不会影响程序的执行。