Escape \u000d
завершает комментарий, потому что \u
escape-символы равномерно преобразуются в соответствующие символы Unicode до программа токенизируется. Вы также можете использовать \u0057\u0057
вместо //
, чтобы начать комментарий.
Это ошибка в вашей среде IDE, которая должна выделять синтаксис строки, чтобы было ясно, что \u000d
заканчивает комментарий.
Это также ошибка дизайна языка. Сейчас это исправить нельзя, потому что это сломало бы программы, которые от него зависят. \u
escape-последовательности должны быть либо преобразованы компилятором в соответствующий символ Unicode только в тех контекстах, где это «имеет смысл» (строковые литералы и идентификаторы, и, вероятно, нигде больше), либо им следовало запретить генерировать символы в U + 0000 –007F диапазон или оба. Любая из этих семантик предотвратила бы завершение комментария с помощью экранирования \u000d
без вмешательства в случаи, когда \u
экранирование полезно - обратите внимание, что включает использование экранирования \u
внутри комментариев как способ кодирования комментариев нелатинским шрифтом, потому что текстовый редактор может иметь более широкое представление о том, где экранирование \u
имеет значение, чем компилятор. (Я не знаю ни одного редактора или IDE, которые отображали бы \u
escape-последовательности как соответствующие символы в любом контексте .)
В семействе C имеется аналогичная ошибка проектирования, 1 , где обратная косая черта-новая строка обрабатывается до определения границ комментария, например,
// this is a comment \
this is still in the comment!
Я привожу это, чтобы проиллюстрировать, что бывает легко сделать эту конкретную ошибку дизайна и не осознавать, что это ошибка, пока не станет слишком поздно исправить ее, если вы привыкли думать о токенизации и синтаксическом анализе. программисты компилятора думают о токенизации и парсинге. По сути, если вы уже определили свою формальную грамматику, а затем кто-то придумал особый синтаксический случай - триграфы, обратную косую черту-новую строку, кодирование произвольных символов Unicode в исходных файлах, ограниченных ASCII, независимо от того, что нужно вклинить, проще добавьте проход преобразования перед токенизатором, чем нужно переопределить токенизатор, чтобы обратить внимание на то, где имеет смысл использовать этот особый случай.
1 Для педантов: я знаю, что этот аспект C был на 100% преднамеренным, с обоснованием - я не выдумываю - что он позволит вам механически принудительно подогнать код с произвольным длинные строки на перфокартах. Это все еще было неправильным дизайнерским решением.
Как ни странно, я не считаю это серьезной проблемой. Обычные пользователи не заметят разницы между кодом, скрытым в комментарии, и обычным кодом, поэтому для них это не имеет значения. Тогда это может быть член команды, скрывающий код от других участников, но разработчики отреагируют, увидев такой странный комментарий, и либо удалят его, либо исследуют. Если бы это было реализовано и введено в действие, VCS сообщит вам, кто это сделал, и вас поймают.
По крайней мере, одна интересная вещь заключается в том, что OP IDE явно ошибается и отображает неправильную подсветку,
Возможно связанный: coderhelper.com/questions/4448180/…
@Tobb: Да, авторитетный ответ может исходить только от дизайнеров. Однако может быть некоторая информация о том, почему это было сделано (совместимость, ограничения инструментов и т. Д.), Поэтому ответственность несет.
потому что символ новой строки также разрешен ... я тестировал его с помощью C ++ и C #, эти языки пропускают строки после чтения // но java, похоже, анализирует строку полностью и интерпретирует код как символ новой строки.
@Tobb Но разработчики Java посещают SO, поэтому возможно получить ответы от одного из них. Также могут существовать ресурсы, которые уже отвечают на этот вопрос.
Я не знаю наверняка, но подозреваю, что это всего лишь побочный эффект от общего решения обрабатывать символы unidoce внутри комментариев. Возможно, чтобы разрешить комментарии к коду на иностранных языках или с математическими знаками греческого языка. Лично я бы этого избегал ... (javadoc может быть исключением, но тогда мне не нужна эта функция, потому что HTML имеет собственную поддержку специальных символов).
coderhelper.com/questions/3866187/… забавный пример
Экраны Unicode разрешены где угодно и всегда анализируются раньше всего. Цель состоит в том, чтобы любой исходный файл можно было преобразовать в эквивалентный файл, содержащий только символы ASCII.
Связанный: coderhelper.com/q/13116648/319403
@dhke: это также отображается как комментарий в Eclipse, так что знаете ли вы какую-либо среду IDE, которая не отображает его как комментарий?
@Thomas Netbeans (по крайней мере, в 8.0.2) завершает комментарий после того, как Unicode экранировал новую строку, показывая
println()
в качестве кода. Он также показывает то же поведение, что и компилятор для начального кода экранированного комментария из coderhelper.com/questions/4448180/…Это также означает, что недопустимые escape-последовательности Unicode в комментариях вызывают ошибки компиляции (например, путь в Windows продолжается
\users
), что может раздражать.@dhke ОП не упомянул, как его / ее IDE отображает этот код. Единственное, что мы можем сказать о выделении из текста вопроса, это то, что выделитель кода Java здесь, в SO, ошибается.
То, что вы показываете, является ошибкой в среде IDE. Это совершенно правильный код. То, что IDE не показывает это как код, является ошибкой. IDE должны перестать предполагать, что компиляторы не знают Unicode.
@CuriousRabbit, что заставляет вас сделать вывод, что это ошибка в IDE OP? (Откуда вы вообще знаете, что OP - это , используя IDE?)
Простой ответ заключается в том, что код вообще не находится в комментарии по правилам языка, поэтому вопрос неправильно сформулирован.
\u000d
- возврат каретки;\u000a
будет новой строкой. Любой из них заканчивает комментарий//
.