显式/隐式类型转换c ++

时间:2013-10-01 12:54:39

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

我有一行代码

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

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

4 个答案:

答案 0 :(得分:6)

  

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

演员阵营适用于1.5long的价值为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对5对6)。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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)

答案 3 :(得分:0)

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

(long)1.5 * 5.0

5.0 * (long)1.5

这里显而易见的是优先级与第一个版本相同