eplang 2009-04-27 15:16
浏览 330
已采纳

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

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

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

  • 写回答

1条回答

  • rednaxelafx 2009-04-27 17:18
    关注

    呵呵,这个容易解释。条件表达式的语法近似是(*):
    [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]

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥30 求一段fortran代码用IVF编译运行的结果
  • ¥15 深度学习根据CNN网络模型,搭建BP模型并训练MNIST数据集
  • ¥15 lammps拉伸应力应变曲线分析
  • ¥15 C++ 头文件/宏冲突问题解决
  • ¥15 用comsol模拟大气湍流通过底部加热(温度不同)的腔体
  • ¥50 安卓adb backup备份子用户应用数据失败
  • ¥20 有人能用聚类分析帮我分析一下文本内容嘛
  • ¥15 请问Lammps做复合材料拉伸模拟,应力应变曲线问题
  • ¥30 python代码,帮调试,帮帮忙吧
  • ¥15 #MATLAB仿真#车辆换道路径规划