Dos Eqius!

Dos Eqius

:下面程序将会打印什么?

Public class DosEquis

{

Public static void main(String [] args)

{

Char x = X;

Int I = 0;

System.out.printf(true ? x: 0);

System.out.printf(false ? i: x);

}

}

没有运行结果之前以为是打印 XX

但是,很遗憾 结果显示为 X88。即第一个printf函数打印出的结果是和我们猜想的一样的X.但是第二个printf打印的确实88.

 

 

为什么是这个结果?

 

 

查阅书籍<<java 解惑>>后得出结论!

 

 

答案就是因为条件表达式的规范化。不知道大家注意没有两个表达式中,每一个表达式的第二个和第三个操作数的类型都不同:char 类型的,而0i都是int 类型的。

 

混合类型的运算会引起混乱,在条件表达式中更为明显。

 

确定条件表达式结果类型的规则有核心的三点:

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

2、 如果一个操作数的类型是TT表示byte short /char 而另一个操作数的类型是一个int 类型的常量表达式,她的值可以用类型T来表示,那么条件表达式的类型就是T

3、 如果不是以上的情况,将对操作数进行二进制的提升,而条件表达式的类型就是第二个和第三个操作数被提升之后的类型。

 

 

 

在本题中,程序的两个表达式中,一个操作数的类型是char  另一个的类型是int。在这两个表达式中,int操作数都是0 ,它可以被表示为一个char.然而,只有第一个表达式的Int 操作数是常量(0),二第二个表达式的int 操作数是变量(i.根据以上的三天规则,发现第二点可以应用到第一个表达式中,第三点应用到第二个表达式中,其返回的类型是对int 和 char 进行二进制数字提升之后的类型。

 

 

 

条件表达式的类型将确定调用哪一个重载的print方法。对第一个表达式来说,将调用printStream.print(char),而对于第二个表达式来说,将调用PrintStream.print(int )

前一个重载方法将变量x的值作为Unicode字符(X)打印,而后一个重载方法将其作为一个十进制整数(88)打印。

所以最后输出的结果就是X88.

 

 

 

 

 

 

  

原文地址:https://www.cnblogs.com/LLeiFeng/p/2848270.html