使用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 : 0
和condition ? 0 : x
condition ? 0 : x
表格,15.25.2规则之一(我在上面省略)是:
- 如果其中一个操作数是T类型,其中T是byte,short或char,另一个操作数是int类型的常量表达式(第15.28节),其值可以在类型T中表示,那么条件表达式的类型是T.
0符合此描述。 x
是char
,0适合char
,因此条件的类型为char
,并且字符被打印。