【问题标题】:Switch Statement QuotesSwitch 语句行情
【发布时间】:2014-10-02 03:57:25
【问题描述】:

使用 Java,我正在阅读一本书以重新复习我在大学时忘记的基础知识,它们向我展示了这样一个 swtich 声明:

void helpon(int what) {
    switch(what) {
        case '1': break;
        case '2': break;
    }
}

我省略了案例代码,因为不相关。

但是,我觉得使用 int 并且仍然将 case 语句用单引号括起来很奇怪,所以我去了 oracle docs 并找到了一个与上面的示例相同的示例,但没有引号。

对于使用整数作为 case 的 switch 语句,引号是否重要?如果whatint'1' 是字符,为什么'1' 会起作用?

【问题讨论】:

  • 其实是char
  • 啊,当然抱歉。我已经习惯了 javascript 这些变量类型不熟悉!
  • '1'1 是不同的。 1 是一个整数,而'1' 是一个char,可以转换为int。但是对它进行类型转换不会产生您想到的值:字符'1'实际上是整数49(字符1的ascii代码)
  • @BackSlash 与该逻辑,如果what == 1 并且 case 显然是 49,单引号 switch 案例如何运行?
  • @SterlingArcher 简单:它无法运行 :)

标签: java switch-statement


【解决方案1】:

单引号字符是文字​​ chars 和 char 值属于 int 值。 char 可以从其 UTF-16 值表示为 int,例如:

char c = '1';
int i = c;
System.out.println(i);

输出:

49

更多信息:


不要混淆 ASCII 字符(单字节,值从 0 到 127)和 UTF-16(每个代码点 2 个字节,值从 0 到 65535)。更多信息:Unicode, UTF, ASCII, ANSI format differences

【讨论】:

  • 恐怕我不知道那是什么意思——你能多解释一下或链接到文档以获得解释吗?
  • 如果 JVM 确定在该上下文中 char 应转换为 int,则将其替换为其 ASCII 代码。例如,int i = '0' - 48; 等价于 int i = 0,因为字符 '0'-'9' 对应于整数 48-57。
  • 这有点道理。我现在正在阅读文档,对我来说越来越清楚了。谢谢!
  • @Dici 不是“由 JVM 确定”,而是 Java 编译器。
  • 这是吹毛求疵,但没有“UTF-16 值”。 UTF-16 将 Unicode 代码点编码为字节。 Unicode 包含超过 65,535 个字符,因此 UTF-16 不是固定宽度编码。 U+FFFF 以上的代码点使用代理对表示。
【解决方案2】:

我只是想增加一些深度。是的,'1' 是 1 的 char,它存储为 int value,这就是为什么您可以在 char 声明中使用 int 的原因(单引号是另一种方法)。但是,char 存储为最大为 65,535 的范围(Java 是 utf-16,我相信是 2^16)。如果没有强制转换,你不能在 char 中有一个负的 int 值,并且强制转换会产生一个奇怪的字符。大于范围的值是个问题。

开关将采用以下 int、char、short、byte(任何适合 int 的内容)和 SE7 的 String。基本上,原语和 String 对象是可以接受的。您可以将基元转换为 Integer、Character、Short;Byte 等对象。

从技术上讲,只要您检查正确的内容,就可以使用 char 范围内的 int 或 char 来表示这种情况。

对于 int,应该使用自动适合 int 的任何内容。转换开关参数会导致精度损失。

为了更好的衡量,不要忘记打破,否则你会摔倒。此外,case 语句必须是可在编译时确定的常量,可以是已知和可接受的原语的算术运算、使用 final 修饰符的已知原语,或者是直接编码的常量。

【讨论】:

  • 我知道 break 这就是我在代码中使用它的原因 ;)
  • 只是为了深入,因为你说审查。我明天有 SE7I。
  • ASCII 值直到 127,直到 65535。那是 UTF-16。
【解决方案3】:

这里的字符“1”和“2”被解释为它们的 UTF-16 值。所以'1'实际上被评估为49,'2'被评估为50,依此类推。

我需要更多代表来发布图片,但这里有一个 ASCII 代码图表。 http://asciiset.com/asciitable.gif.

【讨论】:

  • 不是 ASCII,而是 UTF-16。
  • 我在看到您对 Vishrant 答案的评论后进行了编辑,但是 ASCII Dec 值是否也不是正确的表达方式?有区别吗?
  • 是的,有一个巨大的差异。检查我的答案的编辑。
【解决方案4】:

char 将转换为 UTF-16,然后进行比较。同样在Java7之后你也可以在switch case中写String。

【讨论】:

  • 不是 ASCII 而是 UTF-16。
  • 没有 ASCII int 这样的东西。 ASCII = 美国信息交换标准代码。
猜你喜欢
  • 1970-01-01
  • 2010-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多