C++ 显式/隐式类型转换c++;
我有一行代码C++ 显式/隐式类型转换c++;,c++,implicit-conversion,explicit-conversion,C++,Implicit Conversion,Explicit Conversion,我有一行代码 double i = 1 + (long)1.5* 5.0f 我的问题是转换顺序和结果是什么?我一直在寻找这样的例子,但没有结果。有什么好的指南可以帮助我理解它吗?应该告诉你你需要知道的一切 铸造:1.5铸造为long 乘法:1.5*5.0f,它将此产品强制转换为浮点 添加:1+((长)1.5)*5.0f) 分配:i=1+((长)1.5*5.0f) 从中可以看出,强制转换运算符的优先级高于乘法,但请按照建议使用括号 我的问题是转换顺序和结果是什么 强制转换应用于1.5,给出一个值
double i = 1 + (long)1.5* 5.0f
我的问题是转换顺序和结果是什么?我一直在寻找这样的例子,但没有结果。有什么好的指南可以帮助我理解它吗?应该告诉你你需要知道的一切
1.5
铸造为long
1.5*5.0f
,它将此产品强制转换为浮点
1+((长)1.5)*5.0f)
i=1+((长)1.5*5.0f)
1.5
,给出一个值为1
的long
将其转换为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)
double i=1+静态施法(1.5*5.0f)
有什么好的指南可以帮助我理解它吗
这里有一个:。请注意,类型转换的优先级高于乘法,而乘法又高于加法(3对5对6)。如果您不确定转换运算符的优先级,请重写表达式(在您的头脑中) 到
这里很明显什么具有优先权,与第一个版本相同如果您不确定,请在代码中加括号。((长)(1.5*5.0f))你在谈论优先表吗?@MartinPerry-如果你不确定,做一些研究。盲目添加括号通常会造成无法阅读的混乱。或者,在这种情况下,使用一种新的样式转换:
static_cast(1.5*5.0f)
似乎是一个很好的候选。转换为long意味着乘法是1L*5.0f
“1被提升为浮点”。这里的“晋升”一词正确吗?我认为它应该被“转换”。@Nawaz:是的,你说得对。我永远记不清哪个是哪个。@MikeSeymour真的很重要吗?(值得一提的是:即使两个操作数具有相同的类型,也会发生提升。其他所有事情都是转换。此外,我认为唯一一次浮点提升是作为匹配…
)的函数参数进行的。@JamesKanze:不,这不重要,但是这里有足够多的书呆子,我宁愿把事情做好。@JamesKanze:这在这里并不重要。但我正在努力适应规范使用的术语,这样当我看规范/提案/草案时,我可能会觉得它是可以理解的。在我的第一次评论中,我只是想确认我对事情的理解是正确的。:-)
(long)1.5 * 5.0
5.0 * (long)1.5