【发布时间】:2012-06-06 14:45:06
【问题描述】:
我的代码简化为:
int x = 5;
x *= 0.5;
使用 Visual Studio 进行编译时,我收到一条警告 C4244,提示可能丢失数据 - 当然,因为(简化)将 int 乘以 double 会导致 double,然后将其转换为 int,从而丢失非-整数部分。
我的问题是,是否有 C++ 语法来指示这是预期的行为,以便使警告静音(我知道 pragma push/pop 以禁用警告,我认为更清楚地表明这实际上是预期的行为,而且我不只是压制警告)。
长格式是在乘法之后显式转换,如下所示:
x = (int)(x * 0.5);
但复合运算符符号更易于阅读。
那么,有没有办法像这样投射?我已经尝试将“(int)”放在我能想到的每个位置,但它们似乎都不是有效的 C++ :(
【问题讨论】:
-
我很确定会消除您需要切换到其他内容的警告(例如,
x /= 2;或x >>= 1;)。 -
总是
0.5?如果您对小数部分不感兴趣,为什么不使用整数除法? -
顺便说一下,C++ 方式是
x = static_cast<int>(x * 0.5)。在 C++ 中不鼓励使用括号强制转换。 -
@JerryCoffin:我不会使用右移(OP 使用有符号类型,如果
x < 0行为变为实现定义)。 -
编译器将在适当的地方使用移位。只写最自然的东西(即
x /= 2;表示除法)。
标签: c++