class Why
{
public static void main(String[]s)
{
String st2="A";
System.out.println(st2);
// String st4="MN3444\u000ar4t4";
System.out.println(st4);
}
}
请编译上述代码,我在注释行收到了错误提示。 我无法理解编译器的行为,这个错误是什么意思?
class Why
{
public static void main(String[]s)
{
String st2="A";
System.out.println(st2);
// String st4="MN3444\u000ar4t4";
System.out.println(st4);
}
}
在编译之前,每个Unicode字符都会被其值替代,因为\u000a
表示换行代码
// String st4="MN3444\u000ar4t4";
与此代码相同(请注意,在\u000a
之后的文本将移到新行,这意味着它将不再是注释的一部分)
// String st4="MN3444
r4t4";
您可以使用以下方式进行测试:
//\u000a;System.out.println("hello comment");
等同于
//
System.out.println("hello comment");
执行该程序将以以下结果输出:hello comment
\u000a
翻译为其值之后,你的代码在\u000a
之后将不再是评论,而是单独的一行。 - Pshemo如果我们查看 \u000a
的 ASCII 表,我们会发现这是一个换行符。因此我认为编译器会用相应的值替换注释中的 ASCII 转义字符。由于这是一个换行符,代码看起来像这样:
// String st4="MN3444
r4t4";
/* String st4="MN3444
r4t4"; */
这是一条很好的评论。
行为已经被定义:JLS §3.2. 词法转换
使用以下三个词法转换步骤,将原始Unicode字符流转换为标记序列:
在Unicode字符流中翻译Unicode转义(§3.3)到相应的Unicode字符。 形如\uxxxx的Unicode转义,其中xxxx是一个十六进制值,代表编码为xxxx的UTF-16代码单元。此翻译步骤允许任何程序仅使用ASCII字符来表示。
就像一个测试用例一样,这会编译成功 :)
\u0053\u0079\u0073\u0074\u0065\u006d\u002e\u006f\u0075\u0074\u002e\u0070\u0072\u0069\u006e\u0074\u006c\u006e\u0028\u0022\u0054\u0068\u0069\u0073\u0020\u0069\u0073\u0020\u0063\u006f\u006f\u006c\u0021\u0022\u0029\u003b