【问题标题】:char conversion in ternary operator in Java, prints int value instead of char valueJava中三元运算符中的char转换,打印int值而不是char值
【发布时间】:2021-06-11 09:22:00
【问题描述】:

在 Java 中,您可以使用 char 值或 ASCII 值将 char 转换为 int ,反之亦然。如果将 int 变量转换为 char,则会得到相应的字符。所以,下面的 sn-p 将打印 'a':

int x = 97;
System.out.println( (char)x ); // 'a'

但是当我这样做时:

char ch = 'a', ch2 = 97, ch3 = 'b';
System.out.println( ( (ch+=1) > ch2 ) ? (char)ch2 : (int)ch3 );

编译器会打印出 int 值 97,而不是 'a',即使“真面”上的三元运算符返回值是 (char)ch2。所以我期待的是 'a' 而不是 97。为什么它打印的是 97 而不是 'a'?

【问题讨论】:

    标签: java casting conditional-operator primitive primitive-types


    【解决方案1】:

    问题在于:

    System.out.println(((ch += 1) > ch2) ? (char) ch2 : (int) ch3);
    

    因为您有(int) ch3,编译器假定三元运算符的返回类型将是int

    检查来自 JLS 15.25. Conditional Operator ? :的规则的突出显示部分

    条件表达式的类型确定如下:

    • 如果第二个和第三个操作数的类型相同(可能是空类型),那么这就是条件表达式的类型。

    • 如果第二个和第三个操作数之一是原始类型 T,而另一个的类型是应用装箱转换的结果 (§5.1.7) 到 T,则条件表达式的类型为 T。

    • 如果第二个和第三个操作数之一是空类型,另一个是引用类型,那么 条件表达式就是那个引用类型。

    • 否则,如果第二个和第三个操作数具有可转换(第 5.1.8 节)为数值类型的类型,则有以下几种情况:

      • 如果其中一个操作数的类型为 byte 或 Byte,而另一个为 short 或 Short 类型,则条件表达式的类型为 短。

      • 如果其中一个操作数是 T 类型,其中 T 是 byte、short 或 char,而另一个操作数是类型的常量表达式(第 15.28 节) int,其值可以用类型 T 表示,然后是 条件表达式是T。

      • 如果其中一个操作数是 T 类型,其中 T 是 Byte、Short 或 Character,而另一个操作数是一个常量表达式(第 15.28 节) 类型 int,其值可在类型 U 中表示,即 对 T 应用拆箱转换的结果,然后是 条件表达式是U。

      • 否则,二进制数值提升(第 5.6.2 节)将应用于操作数类型,条件表达式的类型为 第二个和第三个操作数的提升类型。

        注意二进制数值提升执行值集转换 (§5.1.13) 并且可以执行拆箱转换 (§5.1.8)。

    • 否则,第二个和第三个操作数分别是 S1 和 S2 类型。令 T1 为应用拳击产生的类型 转换为 S1,并令 T2 为应用产生的类型 拳击转换为 S2。

    如果你这样做

    System.out.println(((ch += 1) > ch2 ) ? (char) ch2 : (char) ch3);
    

    它会打印出来

    'a'
    

    或者,您可以应用蛮力,即将最终结果转换为char,如下所示:

    System.out.println((char) (((ch += 1) > ch2 ) ? (char) ch2 : (int) ch3));
    

    它也会打印出来

     'a'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-17
      • 2015-09-01
      • 2012-10-23
      • 2016-07-20
      • 2020-12-06
      • 2014-02-14
      • 1970-01-01
      • 2021-07-03
      相关资源
      最近更新 更多