为什么三元运算符使字符变量打印整数而不是字符?

问题描述 投票:0回答:1
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 integer character conditional-operator
1个回答
0
投票

因为三元

? :
运算符仍然是单个表达式,它仍然必须具有单个类型,因为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。

© www.soinside.com 2019 - 2024. All rights reserved.