Может ли комментарии иметь какое-либо значение во время выполнения?

чтение Какой самый лучший комментарий Я приветствую этот комментарий, проголосовавший 201 раз:

Давным-давно я случайно исправил ошибку в Java3D, добавив
комментарий. Это было воспроизводимо на 100%; если я удалил комментарий, это
разбился. Пока комментарий был там, он работал нормально. Я предполагаю это
была какая-то странная временная проблема, но я так и не понял, что именно
происходило.

Это возможно?

Если он исправлял segfault в Java3D, я думаю, он писал код на Java или C / C ++. Я думал, что на любом из этих языков комментарии просто стираются перед компиляцией …

2

Решение

Я думал, что на любом из этих языков комментарии просто стираются
до компиляции …

Казалось бы, но, к сожалению, это безвредный-Ищу Hello World Программа даже не скомпилируется.

Зачем? Из-за комментарий. Виновником является путь источник. В частности, \users, Обратная косая черта \ сопровождается буквой u, обозначает начало экранирования Юникода. Трейлинг sers делает это неудачным выходом из Юникода. (Было бы хорошо, если \u за ним следовали 4 шестнадцатеричные цифры — да, это нужно даже в комментарии.)

Таким образом, код даже не скомпилируется из-за комментария.

public class HelloWorld {

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

Другие решения

Как вы заявляете, в 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");
}
}

Если мы проанализируем байт-код с javap, с помощью javap -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
}
2

Вот два объяснения этому.

Во-первых, репортер был неправ. Они не делали редактирование, которое, как они полагали, они делали или компилировали или выполняли неправильно, или ошибка была ошибочной и случайно совпала с их изменениями, и так далее.

Во-вторых, редактирование удалило то, что выглядело как комментарий, но на самом деле оно взаимодействовало с другим синтаксисом. Например, рассмотрим:

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

Когда присутствует строка «Не новый комментарий», «Некоторый код здесь» является исходным кодом, который не является частью комментария. Если строка «Не новый комментарий» отсутствует, «Некоторый код здесь» является частью комментария.

1

Не думай так. Чтобы запустить Java-программу, она должна быть скомпилирована в байт-код, чтобы комментарии были удалены во время компиляции и не могли повлиять на выполнение программы.

1
По вопросам рекламы [email protected]