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值的主要内容,如果未能解决你的问题,请参考以下文章