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

时间:2017-02-28 05:30:38

标签: java char

我最近遇到的情况是,在第一个syso()字符工作正常但在第二个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代码?请帮忙

1 个答案:

答案 0 :(得分:2)

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

根据JLS section 15.25.2(强调和[]注意我的):

  

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

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

...

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

binary numeric promotion's relevant rule is(强调我的):

  

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

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

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

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

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

  •   

因此:

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

表达式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 : 0condition ? 0 : x表单,15.25.2中的一条规则(我在上面省略)是:

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

0适合此描述。 x是一个char,0适合char,因此条件的类型为char,并打印字符。