char g = 'G';
int i = 0;
System.out.print(1 == 1 ? g : 0);
System.out.print(" ");
System.out.print(1 == 0 ? i : g);
理论上,这应该打印出“GG”,因为它两次打印字符变量的值。 然而,第二次它打印出字符“G”的 ASCII 值。
上面的代码将打印出“G 71”,这不是预期的结果。
char g = 'G';
int i = 0;
System.out.print(1 == 1 ? g : 0);
System.out.print(" ");
System.out.print(1 == 0 ? 0 : g);
但是,第二位代码将打印出“G G”,这是预期的。
因为三元
? :
运算符仍然是单个表达式,它仍然必须具有单个类型,因为Java是静态类型的。因此,类型必须匹配或使其匹配。如果类型无法匹配,则会产生错误。但是,char
可以隐式转换为 int
,但反之则不然,所以这正是发生的情况。
System.out.print(1 == 0 ? i : g);
导致隐式转换而不是System.out.print(1 == 0 ? 0 : g);
的原因是因为0是一个常量表达式,已经可以表示为char
,但i
则不能,因为i
是int
类型的变量
.
来自规格:
条件表达式的类型确定如下:
...
如果其中一个操作数为 byte 或 Byte 类型,另一个操作数为 Short 或 Short 类型,则条件表达式的类型为 Short。
如果其中一个操作数是 T 类型,其中 T 是 byte、short 或 char,而另一个操作数是 int 类型的常量表达式 (第 15.28 节),其值可以用类型 T 表示,则条件条件的类型表达式为 T。