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]

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

报告相同问题?

悬赏问题

  • ¥15 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?
  • ¥15 c++头文件不能识别CDialog