【问题标题】:explicit/implicit type conversion c++显式/隐式类型转换 C++
【发布时间】:2013-10-01 12:54:38
【问题描述】:

我有一行代码

double i = 1 + (long)1.5* 5.0f

我的问题是转换顺序和结果是什么?一直在寻找这样的例子,但无济于事。有什么好的指南可以帮助我理解它吗?

【问题讨论】:

  • 如果您不确定,请将括号放入您的代码中。 ((长)(1.5 * 5.0f))
  • 你说的是优先表吗?
  • @MartinPerry - 如果您不确定,请进行一些研究。盲目地添加括号通常会造成难以理解的混乱。或者,在这种情况下,使用新的样式转换:static_cast<long>(1.5*5.0f) 似乎是一个不错的选择。

标签: c++ implicit-conversion explicit-conversion


【解决方案1】:

我的问题是转换顺序和结果是什么?

演员表应用于1.5,给出一个long,其值为1

转换为float 以与5.0f 相乘,得到float 的值为5.0f

1 转换为 float 以与该值相加,得到一个 float 与值 6.0f

最后,将其提升为double(保留值6.0)以分配给i

这假定了一种可以精确表示小整数的非疯狂浮点格式;否则,可能会出现舍入错误。

如果你想转换乘法的结果,那么使用括号来控制运算符的优先级:

double i = 1 + (long)(1.5* 5.0f);  // = 8.0

或使用 C++ 风格的强制转换,强制使用括号:

double i = 1 + static_cast<long>(1.5* 5.0f)

有什么好的指南可以帮助我理解它吗?

这是一个:http://en.cppreference.com/w/cpp/language/operator_precedence。请注意,类型转换的优先级高于乘法,而乘法又高于加法(3 vs. 5 vs. 6)。

【讨论】:

  • “1 被提升为浮动”。这里的“晋升”一词正确吗?我认为它应该被“转换”。
  • @Nawaz:是的,你是对的。我永远记不清哪个是哪个。
  • @MikeSeymour 真的很重要吗? (对于它的价值:即使两个操作数具有相同的类型,也会发生提升。其他一切都是转换。另外,我认为浮点提升的唯一时间是作为匹配...的函数参数)跨度>
  • @JamesKanze:不,这不重要,但这里有足够多的学究,我更愿意把事情做好。
  • @JamesKanze:这里不重要。但我正在努力适应规范使用的术语,这样当我查看规范/提案/草案时,我可能会理解它。在我的第一条评论中,我只是想确认我正确理解了这件事。 :-)
【解决方案2】:

this table 可以看出,强制转换运算符的优先级高于乘法,但请遵循使用括号的建议。

【讨论】:

    【解决方案3】:

    This precedence table 应该会告诉你你需要知道的一切。

    1. 铸造:1.5 被铸造成long
    2. 乘法:1.5 * 5.0f,将这个乘积转换为float
    3. 加:1 + ( ((long) 1.5) * 5.0f)
    4. 分配:i = 1 + ((long) 1.5 * 5.0f)

    【讨论】:

    • 强制转换为 long 表示乘法为1L * 5.0F
    【解决方案4】:

    如果您不确定强制转换运算符的优先级是什么,那么重写表达式(在您的脑海中)

    (long)1.5 * 5.0
    

    5.0 * (long)1.5
    

    这里很明显什么具有优先级,并且与第一个版本相同

    【讨论】:

      猜你喜欢
      • 2011-07-01
      • 1970-01-01
      • 2017-09-10
      • 2016-06-03
      • 1970-01-01
      • 2011-12-25
      • 1970-01-01
      • 1970-01-01
      • 2013-07-09
      相关资源
      最近更新 更多