黑马程序员技术交流社区

标题: Java学习过程中的十大谜题系列-----表达式谜题2 [打印本页]

作者: bobo2017    时间: 2017-10-10 16:32
标题: Java学习过程中的十大谜题系列-----表达式谜题2
     这次我们来测测自己对条件运算符的掌握程度,这个条件运算符也是我们接触到的唯一的三元运算符:问号冒号操作符.大家看看下面的程序会打印什么?
[AppleScript] 纯文本查看 复制代码
public static void main(String[] args) {
                char x ='X';
                int i=0;
                System.out.println(true?x:0);
                System.out.println(false?i:x);
        }

我们先分析一下这个程序,第一个输出语句,(true?x:0)条件为真打印char变量x的值'X',第二个输出语句(false?i:x)条件为假,打印后面char变量x的值'X',这样程序应该输出两个字符 XX .然而提前运行过得朋友会发现打印的并不是XX,而是X88,这是为什么呢,程序逻辑没有任何问题啊?其实这就考验你对问号冒号操作符的理解了.这个问题的答案其实在规范有关条件表达式部分的一个阴暗的角落里.请注意这两个表达式,每一个表达式第二个和第三个操作数的数据类型都不同,x是char类型,i 和 0 是int类型.这种混合类型运算时我们就要特别注意了,一不小心就掉入了大坑之中无法自拔.
这里我们就要深入研究一下条件运算符的规则了,我把这规则总结为四点:
   第一点:第2个操作数和第3个操作数类型相同
         这是我们常规遇到的情况,在这里就不赘述了.
   第二点:两个操作数类型不同,且一个数为最低类型char,byte,short变量,而一个类型是int变量或者double那么输出值都会向上转型为int或者double输出,也就是表达式的类型为int或者double.
   第三点:数两个操作数类型不同,且一个数为最低类型char,byte,short变量,而一个数是一个数字常量,那么这个数字常量会被默认为char,byte,或者short类型,因而输出类型由不是常量的操作数决定.
   第四点:如何两个数据类型不同,且都为char,byte,short变量,则都会自动向上转型为int输出,也就是说表达式的类型为int.
   说这么多我自己都觉得有些懵了,还是来看一下我的测试代码大家理解理解
[AppleScript] 纯文本查看 复制代码
public static void main(String[] args) {
                char x ='X';
                int y=18;
                short s =18;
                byte b =18;
                double d =1.0;
                System.out.println("---------char x; 66-------------");
                System.out.println(true?66:x);        //  B
                System.out.println(true?x:66);        //  X
                System.out.println(false?66:x);        //  X
                System.out.println(false?x:66);        //  B
                System.out.println("---------char x; int y-------------");
                System.out.println(true?y:x);        //        18
                System.out.println(true?x:y);        //        88
                System.out.println(false?y:x);        //        88
                System.out.println(false?x:y);        //        18
               
                System.out.println("--------byte b; char x--------------");
                System.out.println(true?b:x);        //        18
                System.out.println(true?x:b);        //        88
                System.out.println(false?b:x);        //        88
                System.out.println(false?x:b);        //        18
                System.out.println("--------short s; char x--------------");
                System.out.println(true?s:x);        //        18
                System.out.println(true?x:s);        //        88
                System.out.println(false?s:x);        //        88
                System.out.println(false?x:s);        //        18
               
                System.out.println("--------double d ;char x---------------");
                System.out.println(true?d:x);        //        1.0
                System.out.println(true?x:d);        //        88.0
                System.out.println(false?x:d);        // 1.0
                System.out.println(false?d:x);        //        88.0
                System.out.println("--------1.0 ;char x---------------");
                System.out.println(true?1.0:x);        //        1.0
                System.out.println(true?x:1.0);        //        88.0
                System.out.println(false?x:1.0);// 1.0
                System.out.println(false?1.0:x);//        88.0
        }

}


大家可以自己运行一下代码,加深一下理解.




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2