【问题标题】:Why can I assign an int to a char variable without an explicit cast?为什么我可以在没有显式转换的情况下将 int 分配给 char 变量?
【发布时间】:2011-09-03 23:25:45
【问题描述】:

我想知道为什么这个 sn-p 有效。

char ch1;
ch1 = 'a' + 1;
System.out.println(ch1);

在第 2 行中,不是将右侧提升为 int,然后将 int 分配给 char,我们不需要显式转换吗?

同样,我明白当您使用ch1 = 65 时会发生什么。但是由于Java不允许自动向下类型转换,我们不需要从int显式转换为char吗?

【问题讨论】:

    标签: java casting


    【解决方案1】:

    因为Java Language Specification 说:

    此外,如果表达式是 byte、short、char 或 int 类型的常量表达式(第 15.28 节):

    如果变量的类型是 byte、short 或 char,并且常量表达式的值可以在变量的类型中表示,则可以使用缩小原语转换。

    所以你说得对,表达式被提升为int,但因为它是一个常量表达式,所以不需要强制转换。如果它涉及一个变量(或者它的值不适合 char),那就不同了。

    对于此类问题,最好立即查看语言规范,因为它是权威来源,并且对于规范来说非常易读。

    【讨论】:

    • 这是一个非常好的答案。谢谢。我现在明白了。
    【解决方案2】:

    我目前正在使用 Eclipse。有两点需要注意:

    • 编译器在初始化期间检查边界。
    • 编译器计算常量表达式的值,例如3 * (2 + 1)

    这行得通:

    byte b = 127; // works, range of a byte is [-128, 127]
    

    但这不是:

    byte b = 128; // does not work, outside of range
    

    这行得通:

    byte b = 100 + -228; // works, 100 + -228 = -128
    

    但这不是:

    byte b = 1;
    byte c = b + 1; // does not work, why not?
    

    这也不是:

    byte b = 1;
    byte c = b + (byte) 1; // does not work, why not?
    

    注意b 是一个变量表达式。如果涉及变量表达式,则运算符 + 的结果至少与 int 一样大。因此,您不能将其分配给c。与常量表达式不同,编译器不计算变量表达式。

    编译器同样会抱怨shortchar - 自己试试吧。

    最后,在变量上使用final 可以有效地将其转换为常量表达式,所以这会起作用:

    final byte b = 1;
    byte c = b + 1; // works
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-28
      • 1970-01-01
      • 2022-08-11
      • 2019-08-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多