use*_*349 3 c c++ syntax casting
鉴于以下内容:
int a = 10, b = 5, c = 3, d = 1;
int x = 3, y = 2, z = 2;
return (float) a/x + b/y + c/z + d;
Run Code Online (Sandbox Code Playgroud)
这可能会将我们的精度转换为浮动,然后以浮点精度执行我们的分割序列.
使用C++样式转换更新此方法的正确方法是什么?
这真的应该改写为:
return static_cast<float>(a) / static_cast<float>(b) + ... ?
Run Code Online (Sandbox Code Playgroud)
首先纠正您的代码:
(float) a/x + b/y + c/z + d
Run Code Online (Sandbox Code Playgroud)
产生7.33333,而正确的结果是8.33333.为什么?因为b/y和c/z分裂是在ints(演示)完成的.
究其原因,结果是不正确的是分裂的优先级高于另外:你的程序需要来划分b的y,并c通过z 之前将它们添加到分工的结果a通过x,这是float.
您需要转换一个除法操作数才能使其正常工作.C cast工作正常,但如果你更愿意使用C++风格的演员,你可以这样做:
return static_cast<float>(a) / b + static_cast<float>(b) / y +
static_cast<float>(c) / z + d;
Run Code Online (Sandbox Code Playgroud)
/具有更高的优先级+,因此b/y将执行int,而不是执行float.
执行每个除法的正确方法float是将至少一个操作数强制转换为float:
static_cast<float>(a)/x + static_cast<float>(b)/y + static_cast<float>(c)/z + d
Run Code Online (Sandbox Code Playgroud)
这比等效的C表达式更清晰:
(float) a/x + (float) b/y + (float) c/z + d
Run Code Online (Sandbox Code Playgroud)
这里需要先验知识才能认识到演员float要比分裂更紧密.
| 归档时间: |
|
| 查看次数: |
274 次 |
| 最近记录: |