Java三元操作符中的字符转换,打印int值而不是char值



在Java中,您可以使用char值或ASCII值将char转换为int,反之亦然。如果将int变量强制转换为char,则会得到相应的字符。因此,下面的代码片段将打印'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'?

问题是:

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

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

检查突出显示的JLS 15.25规则的一部分。条件运算符?:

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

  • 如果第二个和第三个操作数具有相同的类型(可能是空类型),则该类型为条件表达式的类型。

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

  • 如果第二个和第三个操作数中的一个是null类型,另一个是引用类型,则条件表达式就是引用类型。

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

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

    • 如果其中一个操作数为T类型,其中T为byte、short或char,而另一个操作数为类型为int的值可以用类型T表示,则条件表达式是t

    • 如果其中一个操作数是T类型,其中T是Byte、Short或Character,而另一个操作数是of的常量表达式(§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'

相关内容

  • 没有找到相关文章

最新更新