zoukankan      html  css  js  c++  java
  • 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.

     

     

     

     

     

     

      

  • 相关阅读:
    JMM内存模型
    APUE习题8.7
    整型和字符数组之间的转换(略带进制的转化)
    数据结构学习——shell排序的C语言实现
    Unix环境高级编程学习笔记——fcntl
    Unix环境高级编程学习笔记——dup
    链表
    计算机数值表示
    整数位运算相关操作
    win和linux下控制台界面中停顿X秒的方式
  • 原文地址:https://www.cnblogs.com/LLeiFeng/p/2848270.html
Copyright © 2011-2022 走看看