鉴于以下内容:
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;
这可能会将我们的精度转换为浮点数,然后以浮点精度执行我们的除法序列。
使用C ++样式转换更新此内容的正确方法是什么?
真的 是否应该重写为:
return static_cast<float>(a) / static_cast<float>(b) + ... ?
答案 0 :(得分:7)
首先纠正您的代码:
(float) a/x + b/y + c/z + d
生成7.33333
,而正确的结果是8.33333
。为什么?因为b/y
和c/z
分区是在int
s(demo)中完成的。
结果不正确的原因是除法优先于加法:您的计划需要将b
除以y
而将c
除以z
之前< / em>将a
除以x
float
,将其添加到return static_cast<float>(a) / b + static_cast<float>(b) / y +
static_cast<float>(c) / z + d;
的结果中。
您需要投射其中一个分区操作数才能使其正常工作。 C cast工作正常,但如果你更愿意使用C ++风格的演员,你可以这样做:
{{1}}
答案 1 :(得分:5)
/
的优先级高于+
,因此b/y
将在int
中执行,而不是float
。
在float
中执行每个分区的正确方法是将至少一个操作数强制转换为float
:
static_cast<float>(a)/x + static_cast<float>(b)/y + static_cast<float>(c)/z + d
这比等效的C表达式更清晰:
(float) a/x + (float) b/y + (float) c/z + d
这里需要先验知识才能意识到float
的强制转换比分裂更紧密。
答案 2 :(得分:1)
return (float) a/x + b/y + c/z + d;
如果要返回所有分区总和的float
值,则不正确。在上面的表达式中,只有a/x
为float
分区,其余部分为int
分区(因为/
运算符的优先级高于+
),这将导致价值截断。最好坚持
return (double)a/x + (double)b/y + (double)c/z + d;
答案 3 :(得分:0)
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;
这可能会将我们的精度转换为浮点数,然后以浮点精度执行我们的除法序列。
不,它会将a
转换为float
,因此a/x
将作为浮点除法执行,但b/y
和c/z
是整数除法。之后,在将整数除法结果转换为浮点数后计算总和。
这是因为强制转换只是另一个运算符,它们的优先级高于+
和/
。将float
除以int
或将float
添加到int
会导致int
自动转换为float
。
如果你想要浮点除法,那么你需要插入强制转换,以便在分割之前应用它们,然后自动提升其他值。
return (float) a/x + (float) b/y + (float) c/z + d;
使用C ++语法进行转换是完全相同的,除了语法不会让你对实际投射的内容感到困惑:
return static_cast<float>(a)/x + static_cast<float>(b)/y + static_cast<float>(c)/z + d;
您还可以使用构造函数语法,它还具有清楚显示演员阵容的好处:
return float(a)/x + float(b)/y + float(c)/z + d;
或者你可以简单地使用临时变量:
float af = a, bf = b, cf = c;
return af/x + bf/y + cf/z + d;
答案 4 :(得分:-1)
仅在分割操作时才需要施法。你可以用这种方式淡化语法:
return 1.0*a/x + 1.0*b/y + 1.0*c/z + d;
这会将结果计算为double
类型,如果函数返回此类型,则会自动转换为float
。