在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'