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 cmd批处理参数如果含有双引号,该如何传入?
  • ¥15 fx2n系列plc的自控成型机模拟
  • ¥15 时间序列LSTM模型归回预测代码问题
  • ¥50 使用CUDA如何高效的做并行化处理,是否可以多个分段同时进行匹配计算处理?目前数据传输速度有些慢,如何提高速度,使用gdrcopy是否可行?请给出具体意见。
  • ¥15 基于STM32,电机驱动模块为L298N,四路运放电磁传感器,三轮智能小车电磁组电磁循迹(两个电机,一个万向轮),如何通过环岛的原理及完整代码
  • ¥20 机器学习或深度学习问题?困扰了我一个世纪,晚来天欲雪,能饮一杯无?
  • ¥15 c语言数据结构高铁订票系统
  • ¥15 关于wkernell.PDB加载的问题,如何解决?(语言-c#|开发工具-vscode)
  • ¥100 某宝多次访问被拒绝,求解
  • ¥15 (标签-STM32|关键词-智能小车)