三元运算符关于精度转换的问题.

今天突然有人问我这道题, 我卡住了..

比如说,
x > 10 ? 99.9 : 9
如果条件为否, 会返回什么?

结果会返回9.0

我当时是这么回答他的:
以二元运算符为例, 如果参考两边参数计算的数值如果精度不同的话,
低精度数值会转换为高精度后再计算.
比如说99.9 * 9, 会转换成99.9 * 9.0

而? :的逻辑结果等同于if else, 但他们的处理方式却并不一样,
? :是一个三元运算符, 只要是运算符, 那么参与的数值就需要进行精度转换.
这也就是为什么会返回9.0的原因了.

当时回答他的时候我觉得没啥问题.
但后来一细想, 如果我的说法成立的话,
那么 x > 10.0 ? 99 : 9是不是就是返回99.0或是9.0了?

但实际结果并不是我想的那样...

在google和baidu上搜了一下三元运算符,
基本上都只是说说这玩意的概念而已, 没有提及到这精度转换的,
所以只能在这儿求 助诸高手解释一下.
先谢了.

javaeye来的不多, 不知道这个问题该发到哪个版块, 问题标签也不知道该如何定义..
只能发到我感觉应该是的地方了..
如果发错地方了, 还麻烦版主帮我移一下贴子.

呵呵,这个容易解释。条件表达式的语法近似是(*):
[code="BNF"]ConditionalExpression:
Expression ? Expression : Expression[/code]
其中第一个expression是表示条件的表达式,其类型必须为boolean;
后两个expression分别是条件为真和条件为假时的分支,它们的类型必须一致;
整个条件表达式的类型与两个分支表达式的类型一致。

两个分支表达式的类型必须一致,意味着当两个分支表达式的类型不完全匹配时,需要尝试对它们进行隐式类型转换来达到一致;转换的目标类型是两分支中较“宽”的类型。举例来说,
如果是int和double,则两个分支表达式的类型都会被认为是double,于是int类型的分支就会带有一个int->double的隐式类型转换;
如果是String和Object,则Object较“宽”,于是两个分支都会被认为是Object类型的表达式。

*:实际上Java中ConditionalExpression的语法是这样的:
[code="BNF"]ConditionalExpression:
ConditionalOrExpression
ConditionalOrExpression ? Expression : ConditionalExpression[/code]
这个语法确保了?:运算符的优先级比||低,并且?:运算符是右结合的。详细请参考:
[url]http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#15.25[/url]