首先看下面的一段小程序:
- int num = 13;
- if(num>10){
- char c = (char)(num - 10 +'A');
- System.out.println("I want to get a char: "+c);
- }else{
- System.out.println(num);
- }
- /*
- 输出结果为:
- I want to get a char: D
- */
上面的02行~07行代码可以简化成一行代码,因为三元运算符的存在,但是相较起来,上面的更具有可读性.而三元运算符的使用可以显示你编程的牛叉.
Java中三元运算符表达如下:
[条件语句] ? [表达式1] : [表达式2] |
则上面的代码可以转换写成如下形式:
- // 代码片段1
- System.out.println("I want to get a char :" + (num>10?num-10+'A':num));
- /*
- 或者写成下面的形式,比较明了
- */
- System.out.print("I want to get a char :");
- System.out.println( num>10?num-10+'A':num);
- /*
- 以上结果均输出:68
- */
看来,语法改变了,结果也跟着变了.
对表达式 num-10+'A' 做了如下的改变,并查看结果如下,也非所愿,还是 D的ASCII码值:
- //代码片段2
- System.out.println(num>10?(char)(num-10+'A'):num);
- /*
- 输出结果是:68
- */
将输出语句中的格式再次变化下,结果才是想要的字符D.
- //代码片段3
- System.out.println((char)(num>10?(char)(num-10+'A'):num));
- System.out.println((char)(num>10?num-10+'A':num));
- /*
- 二者均是输出的字符:D
- */
为什么呢?Java虚拟机幽了你一默.以下是对这个问题进行探究的过程,仅供参考,若有问题,请及时指正.
1,查了println()的实现,是函数的重载,根据参数列表中的不同类型进行输出的.比如上面的小例子依次调用的是:
- println(int x) // 代码片段1的调用
- println(int x) // 代码片段2的调用
- println(char x) //代码片段3的调用
2,那么对已代码片段1,代码片段2的输出结果只能从“Java操作符为了防止类型溢出所做的隐式转型处理”这个角度来解释了.所以,在上面两个片段中,表达式的结果分别是char和int,Java编译器当然会将其中较“窄”的char隐式转型为较“宽”的int。接着,片段3,做了显式转型处理,将"宽"的int转型为"窄"的char.
3,如2所言,那下面的结果该如何解释呢?先看代码:
- int num = 13;
- char x = 'X';
- System.out.println(num>10? x:num); //X 的ASCII值 : 88
- System.out.println(num>10? num:x);// num 的数值:13
- System.out.println(num>10? x:90); // 输出的是 X 的 值
- System.out.println(num>10? 90: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” 博客,转载请与作者联系!