Java自学笔记系列九: 三元运算符的"幽默"

 

  首先看下面的一段小程序:

  
  
  
  
  1. int num  = 13
  2. if(num>10){ 
  3.      char c = (char)(num - 10 +'A'); 
  4.       System.out.println("I want to get a char: "+c); 
  5. }else
  6.     System.out.println(num); 
  7. /* 
  8. 输出结果为:
  9.  I want to get a char: D  
  10. */ 

  上面的02行~07行代码可以简化成一行代码,因为三元运算符的存在,但是相较起来,上面的更具有可读性.而三元运算符的使用可以显示你编程的牛叉.

  Java中三元运算符表达如下:

 [条件语句] ? [表达式1] : [表达式2]

 则上面的代码可以转换写成如下形式:

  
  
  
  
  1. // 代码片段1
  2. System.out.println("I want to get a char :" + (num>10?num-10+'A':num)); 
  3. /* 
  4.  或者写成下面的形式,比较明了 
  5. */ 
  6. System.out.print("I want to get a char :"); 
  7. System.out.println( num>10?num-10+'A':num); 
  8. /* 
  9.  以上结果均输出:68 
  10. */ 

  看来,语法改变了,结果也跟着变了.

  对表达式 num-10+'A' 做了如下的改变,并查看结果如下,也非所愿,还是 D的ASCII码值:

  
  
  
  
  1. //代码片段2
  2. System.out.println(num>10?(char)(num-10+'A'):num); 
  3. /* 
  4.  输出结果是:68 
  5. */ 

 将输出语句中的格式再次变化下,结果才是想要的字符D.

  
  
  
  
  1. //代码片段3
  2. System.out.println((char)(num>10?(char)(num-10+'A'):num)); 
  3. System.out.println((char)(num>10?num-10+'A':num)); 
  4. /* 
  5.   二者均是输出的字符:D 
  6. */ 

 为什么呢?Java虚拟机幽了你一默.以下是对这个问题进行探究的过程,仅供参考,若有问题,请及时指正.

  1,查了println()的实现,是函数的重载,根据参数列表中的不同类型进行输出的.比如上面的小例子依次调用的是:

  
  
  
  
  1. println(int x) // 代码片段1的调用 
  2. println(int x) // 代码片段2的调用 
  3. println(char x) //代码片段3的调用 

 2,那么对已代码片段1,代码片段2的输出结果只能从“Java操作符为了防止类型溢出所做的隐式转型处理”这个角度来解释了.所以,在上面两个片段中,表达式的结果分别是char和int,Java编译器当然会将其中较“窄”的char隐式转型为较“宽”的int。接着,片段3,做了显式转型处理,将"宽"的int转型为"窄"的char.

 3,如2所言,那下面的结果该如何解释呢?先看代码:

  
  
  
  
  1. int num  = 13
  2. char x = 'X'
  3. System.out.println(num>10? x:num); //X 的ASCII值 : 88 
  4. System.out.println(num>10? num:x);// num 的数值:13 
  5. System.out.println(num>10? x:90); // 输出的是 X 的 值 
  6. System.out.println(num>1090:x); // 输出的是 ASCII码值为90所对应的字符:Z 

  嗯? 上面的解释在这里说不通.莫非对常量和变量还有不同的编译方式.

  4,个人认为是如果一个表达式的类型是byte、short、char类型的,而另外一个是int类型的常量表达式,且int的值若可以用类型byte、short、char三者之一表示的,那么返回的结果则是三者之一.

 综上所述,可以总结为如下三点:

  1, 如果表达式1和表达式2操作数具有相同的类型,那么它就是条件表达式的类型。

 2, 如果一个表达式的类型是byte、short、char类型的,而另外一个是int类型的常量表达式,且int的值若可以用类型byte、short、char三者之一表示的,那么返回的结果则是三者之一

   3, 表达式1,2类型不一致的时候,可以显式强制转换最终的类型。

    到此为止了,若你有什么好的想法可以追加,欢迎讨论。

       嗯对了,表达式1,2也可以是一个函数调用.这里就不在赘述了.

本文出自 “IvanTian” 博客,转载请与作者联系!

你可能感兴趣的:(java,三元运算符,幽默,探究,显式隐式类型转换)