Java中三元运算符中的char转换,打印int值而不是char值

Posted

技术标签:

【中文标题】Java中三元运算符中的char转换,打印int值而不是char值【英文标题】:char conversion in ternary operator in Java, prints int value instead of char value 【发布时间】: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'?

【问题讨论】:

【参考方案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'

【讨论】:

以上是关于Java中三元运算符中的char转换,打印int值而不是char值的主要内容,如果未能解决你的问题,请参考以下文章

Java:将原始布尔值转换为原始 int (0,1) 的好方法

从 char 转换为 int 并打印十进制值

三元条件运算符中的多个条件?

java三元运算符

char *怎样转成int

如果在三元运算符中使用局部变量,为啥从 int 到 short 的缩小转换不起作用