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

1 java integer character conditional-operator

char g = 'G';
int i = 0;
System.out.print(1 == 1 ? g : 0);
System.out.print(" ");
System.out.print(1 == 0 ? i : g);
Run Code Online (Sandbox Code Playgroud)

理论上,这应该打印出“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);
Run Code Online (Sandbox Code Playgroud)

然而,第二位代码将打印出“G G”,这是预期的。

use*_*248 5

因为三元运算? :符仍然是单个表达式,它仍然必须具有单个类型,因为 Java 是静态类型的。因此,类型必须匹配或使其匹配。如果类型无法匹配,则会产生错误。然而,achar可以隐式转换为 an int,但反之则不然,所以根据整数提升规则,这正是发生的情况。

\n

之所以System.out.print(1 == 0 ? i : g);会导致隐式转换 but notSystem.out.print(1 == 0 ? 0 : g);是因为 0 是一个常量表达式,已经可以表示为 achari不是,因为i是 类型的变量int

\n

规格来看

\n
\n

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

\n

...

\n
    \n
  • 如果其中一个操作数是 T 类型,其中 T 是 byte、short 或 char,而另一个操作数是 int 类型的常量表达式 (\xc2\xa715.28),其值可以用类型 T 表示,则条件表达式为T。
  • \n
\n

...

\n
    \n
  • 否则,二进制数值提升 ( \xc2\xa75.6.2 ) 将应用于操作数类型,并且条件表达式的类型是第二个和第三个操作数的提升类型。
  • \n
\n
\n