【问题标题】:What are the Java semantics of an escaped number in a character literal, e.g. '\15' ?字符文字中转义数字的 Java 语义是什么,例如'\15' ?
【发布时间】:2013-10-07 03:07:29
【问题描述】:

请解释执行以下代码部分时究竟会发生什么:

int a='\15';
System.out.println(a);

这打印出 13;

int a='\25';
System.out.println(a);

这打印出 21;

int a='\100';
System.out.println(a);

这打印出 64。

【问题讨论】:

  • 看起来它正在将数字解释为八进制。
  • int a='\15' 首先基于八进制数“15”(十进制 13,作为字符,它是 ascii“回车”)创建一个 char,然后将其重铸为 int整数。这是合法的,因为 chars 是 16 位整数,所以它是一种安全的向上转换,Java 不会发布关于转换的通知。其他答案已经涵盖了整个八进制/十进制。

标签: java syntax character literals octal


【解决方案1】:

您已将由单引号分隔的字符文字,例如'a'(与由双引号分隔的字符串文字,例如"a" 不同)分配给int 变量。 Java 会自动将 16 位无符号 char 扩大到 32 位有符号 int

但是,当字符文字是反斜杠后跟 1-3 位数字时,它是该字符的 octal (base/radix 8) 表示。因此:

  • \15 = 1×8 + 5 = 13(回车;与'\r'相同)
  • \25 = 2×8 + 5 = 21(一个 NAK 字符 - 否定确认)
  • \100 = 1×64 + 0×8 + 0 = 64(@符号;与'@'相同)

有关字符文字和转义序列的更多信息,请参阅 JLS 部分:

引用 3.10.6 中的 BNF

OctalEscape:
    \ OctalDigit
    \ OctalDigit OctalDigit
    \ ZeroToThree OctalDigit OctalDigit

OctalDigit: one of
    0 1 2 3 4 5 6 7

ZeroToThree: one of
    0 1 2 3

【讨论】:

  • 我在第 3.10.1 节中找不到它。它在 3.10.4 中,字符文字
  • 整数文字部分无关紧要。见Section 3.10.4。另请参阅 Section 3.10.6 了解字符和字符串转义序列。
  • 1-3 digits -- 应该是0-3。并且它为 3 位八进制,两位八进制仍然可以来自0-7。前任。 '\77' 仍然有效。
  • @Jayamohan 我的意思是数量上的 1-3,而不是价值
  • @Bohemian。不错的答案。我建议你在这里添加八进制转义文字的语法,这样会更清楚。 :)
【解决方案2】:

\nnn 表示 Java 中的八进制字符代码。所以int a = '\15' 将八进制字符 15 的自动转换值分配给 a,即十进制 13。

【讨论】:

  • 符号 \nnn 确实 not 表示 Java 中的八进制数。在 OP 的代码中,它表示八进制字符转义序列。周围的引号是必不可少的。然后通过赋值将字符扩展为整数值。 (八进制数由前导零数字表示。)
  • 好点;应该在答案中提到自动转换。更新了答案。
【解决方案3】:

您将数字放在引号中的事实使我怀疑它将数字解释为字符文字。后面的数字必须是八进制。

【讨论】:

    猜你喜欢
    • 2011-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-25
    • 1970-01-01
    相关资源
    最近更新 更多