我最近遇到的情况是,在第一个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代码?请帮忙
答案 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 : 0
和condition ? 0 : x
表单,15.25.2中的一条规则(我在上面省略)是:
- 如果其中一个操作数是T类型,其中T是byte,short或char,另一个操作数是int类型的常量表达式(第15.28节),其值可以在类型T中表示,那么类型为条件表达式是T。
0适合此描述。 x
是一个char
,0适合char
,因此条件的类型为char
,并打印字符。