使用int和char操作数的三元表达式的类型是什么?

我最近遇到的情况是,在第一个syso()charcter正常工作但在第二个syso()中它打印ASCII代码。

public class Test{ public static void main(String[] args) { char x = 'A'; char y= 'B'; int m = 0; System.out.println(true ? x : 0);//Working fine prints A System.out.println(true ? y : 0);//Working fine prints B System.out.println(false ? 0 : y);//Working fine prints B System.out.println(false ? m : x);// Here it prints 65 why ? } } 

我真的想知道它为什么在第二个syso()中打印ascii代码? 请帮忙

问题是false ? m : x的类型false ? m : x false ? m : x ,最终为int ,而不是char

根据JLS第15.25.2节 (重点和[]注意我的):

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

  • 如果第二个和第三个操作数具有相同的类型,那么这就是条件表达式的类型。

  • 否则[如果上述规则都不成立], 二进制数字提升(第5.6.2节)将应用于操作数类型,条件表达式的类型是第二个和第三个操作数的提升类型。

二进制数字促销的相关规则是 (强调我的):

应用扩展基元转换(第5.1.2节)来转换由以下规则指定的一个或两个操作数:

  • 如果任一操作数的类型为double,则另一个操作数转换为double。

  • 否则,如果任一操作数的类型为float,则另一个操作数转换为float。

  • 否则,如果任一操作数的类型为long,则另一个操作数转换为long。

  • 否则,两个操作数都将转换为int类型。

因此:

 char x = ...; int m = ...; 

表达condition ? m : x condition ? m : x被提升为int ,并调用System.out.println(int) ,并将其打印为数字。

你必须显式地将m或整个表达式转换为char ,例如:

 System.out.println((char)(false ? m : x)); 

要么:

 System.out.println(false ? (char)m : x); 

至于你的condition ? x : 0 condition ? x : 0condition ? 0 : x condition ? 0 : x表格,15.25.2规则之一(我在上面省略)是:

  • 如果其中一个操作数是T类型,其中T是byte,short或char,另一个操作数是int类型的常量表达式(第15.28节),其值可以在类型T中表示,那么条件表达式的类型是T.

0符合此描述。 xchar ,0适合char ,因此条件的类型为char ,并且字符被打印。