今天看到一个面试题大概是:int x=4? ((x>4) ? 99.9 :9) 问答案是多少
本人不假思索的回答了 9 但是看了答案百思不得其解。为了一探究竟,百度了一番,最后把官方文档翻出来了再结合
这位大神 http://blog.jobbole.com/93511/
及 这位大神https://www.cnblogs.com/JsonShare/p/6994603.html
的帖子 才算弄明白,因为有了一个自动拆装箱的动作
前后两个类型要统一所以最后答案是9.0
以下是机翻文档
条件运算符 ? :
使用一个表达式的布尔值来决定应该评估其他两个表达式中的哪一个。
ConditionalExpression:
ConditionalOrExpression
ConditionalOrExpression ?
Expression :
ConditionalExpression
条件运算符在语法上是右关联的(它从右到左)。因此,a?b:c?d:e?f:g
意味着相同a?b:(c?d:(e?f:g))
。
条件运算符有三个操作数表达式。?
出现在第一个和第二个表达式:
之间,并出现在第二个和第三个表达式之间。
第一个表达式必须是type boolean
或Boolean
,否则会发生编译时错误。
对于第二个或第三个操作数表达式来说,调用一个void
方法是一个编译时错误。
实际上,通过表达式语句的语法(§14.8),不允许条件表达式出现在void
方法调用可能出现的任何上下文中。
条件表达式的类型如下确定:
-
如果第二个和第三个操作数具有相同的类型(可能是空类型),那么这就是条件表达式的类型。
-
如果第二和第三个操作数中的一个是原始类型的Ť,其它的类型是施加装箱转换(结果§5.1.7)到Ť,那么条件表达式的类型是Ť。
-
如果第二个和第三个操作数中的一个是空类型,而另一个的类型是引用类型,那么条件表达式的类型就是该引用类型。
-
否则,如果第二个和第三个操作数的类型可以转换(§5.1.8)为数字类型,则会出现以下几种情况:
-
如果操作数中的一个是类型
byte
或Byte
另一种是类型short
或Short
,那么条件表达式的类型是short
。 -
如果操作数之一的类型为 Ť其中Ť是
byte
,short
,或char
,另一操作数为常量表达式(§15.28型的)int
,它的值是在式表示的Ť,那么条件表达式的类型是Ť。 -
如果其中一个操作数是T类型,其中T 是
Byte
,Short
或Character
,而另一个操作数是类型为U的类型的常量表达式(第15.28节),int
该类型是将拆箱转换应用于T的结果,然后将条件表达式的类型是ü。 -
否则,对操作数类型应用二进制数字提升(第5.6.2节),并且条件表达式的类型是第二个和第三个操作数的提升类型。
-
-
否则,第二和第三运算数是类型小号1和小号2分别。假设T 1是将装箱转换应用于S 1所得到的类型,并且令T 2是将装箱转换应用于S 2所得到的类型 。
条件表达式的类型是将采集转换(第5.1.10节)应用于lub(T 1,T 2)(第15.12.2.7节)的结果。
在运行时,首先评估条件表达式的第一个操作数表达式。如有必要,对结果执行拆箱转换。
结果boolean
值然后用于选择第二个或第三个操作数表达式:
-
如果第一个操作数的值是
true
,则选择第二个操作数表达式。 -
如果第一个操作数的值是
false
,则选择第三个操作数表达式。
然后评估选定的操作数表达式,并将结果值转换为由上述规则确定的条件表达式的类型。
这种转换可能包括装箱(§5.1.7)或拆箱(§5.1.8)转换。
未选择的操作数表达式不针对条件表达式的特定评估进行评估。
如果那里解释不到的话请各位聚聚见谅