首先看下面的一段小程序 int num = ; if(num>){ char c = (char)(num +A) Systemoutprintln(I want to get a char: +c) }else{ Systemoutprintln(num) } /* 输出结果为 I want to get a char: D */ 上面的行~行代码可以简化成一行代码因为三元运算符的存在但是相较起来上面的更具有可读性而三元运算符的使用可以显示你编程的牛叉 Java中三元运算符表达如下 [条件语句] ? [表达式] : [表达式] 则上面的代码可以转换写成如下形式 // 代码片段 Systemoutprintln(Iwanttogetachar:+(num>?num+A:num)); /* 或者写成下面的形式比较明了 */ Systemoutprint(Iwanttogetachar:); Systemoutprintln(num>?num+A:num); /* 以上结果均输出: */ 看来语法改变了结果也跟着变了 对表达式 num+A 做了如下的改变并查看结果如下也非所愿还是 D的ASCII码值: //代码片段 Systemoutprintln(num>?(char)(num+A):num); /* 输出结果是 */ 将输出语句中的格式再次变化下结果才是想要的字符D //代码片段 Systemoutprintln((char)(num>?(char)(num+A):num)); Systemoutprintln((char)(num>?num+A:num)); /* 二者均是输出的字符D */ 为什么呢?Java虚拟机幽了你一默以下是对这个问题进行探究的过程仅供参考若有问题请及时指正 查了println()的实现是函数的重载根据参数列表中的不同类型进行输出的比如上面的小例子依次调用的是: println(intx)//代码片段的调用 println(intx)//代码片段的调用 println(charx)//代码片段的调用 那么对已代码片段代码片段的输出结果只能从Java操作符为了防止类型溢出所做的隐式转型处理这个角度来解释了所以在上面两个片段中表达式的结果分别是char和intJava编译器当然会将其中较窄的char隐式转型为较宽的int接着片段做了显式转型处理将宽的int转型为窄的char 如所言那下面的结果该如何解释呢?先看代码: intnum=; charx=X; Systemoutprintln(num>?x:num);//X的ASCII值 Systemoutprintln(num>?num:x);//num的数值: Systemoutprintln(num>?x:);//输出的是X的值 Systemoutprintln(num>?:x);//输出的是ASCII码值为所对应的字符:Z 嗯? 上面的解释在这里说不通莫非对常量和变量还有不同的编译方式 个人认为是如果一个表达式的类型是byteshortchar类型的而另外一个是int类型的常量表达式且int的值若可以用类型byteshortchar三者之一表示的那么返回的结果则是三者之一 综上所述可以总结为如下三点: 如果表达式和表达式操作数具有相同的类型那么它就是条件表达式的类型 如果一个表达式的类型是byteshortchar类型的而另外一个是int类型的常量表达式且int的值若可以用类型byteshortchar三者之一表示的那么返回的结果则是三者之一 表达式类型不一致的时候可以显式强制转换最终的类型 到此为止了若你有什么好的想法可以追加欢迎讨论 嗯对了表达式也可以是一个函数调用这里就不在赘述了 |