4

我有一行代码

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

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

4

4 回答 4

6

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

强制转换应用于1.5,给出一个longwith 值1

将其转换为float与 相乘5.0f,给出一个floatwith 值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)。

于 2013-10-01T13:01:02.097 回答
1

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

于 2013-10-01T13:00:35.033 回答
0

这个优先表应该告诉你你需要知道的一切。

  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)
于 2013-10-01T12:59:07.573 回答
0

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

(long)1.5 * 5.0

5.0 * (long)1.5

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

于 2013-10-01T13:41:48.447 回答