C#中的强制类型转换优先级

12

以下的差异在C#中会显著吗?

int a, b;
double result;
result = (double)a / b;
result = a / (double)b;
result = (double)a / (double)b;

你使用哪个?


请确保不要使用 result = (double)(a/b); - Emond
这些都不是必需的。ab已经是双精度浮点数。结果变量也是双精度浮点数。唯一不是双精度浮点数的是两个双精度浮点数相除的结果。如果我没记错的话,在这种情况下可以将整数自然转换为双精度浮点数。 - Security Hound
4
@a和@b是整数,不是浮点数。执行result = a / b将导致整数除法,然后转换为双精度浮点数。 - Msonic
3个回答

13

划分之前进行强制类型转换。

在你的示例中,无论你执行哪个操作数,如果一个操作数是double类型,运行时会将另一个操作数也转换为double类型。

这看起来像是微观优化——除非测量结果表明它确实是瓶颈,否则不值得担心或处理。


2
我的主要关注点是计算结束时的精度。我担心无论我选择哪个进行转换(首先,显式地),都会有所不同。但既然你说内部会将它们全部转换,那我就相信你。 - Jake
@Jake - 相信,但要验证... 这是你可以轻松测试的事情(只需编写一个执行不同类型计算的小应用程序)。 - Oded
2
实际上,小应用程序并不能证明什么。除非首先确定它是如此实现的,否则一小部分测试操作数无法代表所有可能的操作数的结果。因此,我不得不问这个问题。 - Jake

3

I do this:

result = (double)a / (double)b;

这可能严格来说是不必要的,但通常我想要确保它不会执行整数除法,而且我并不在乎记住这种情况的具体规则,所以更明确一些(即使需要多按一些键)也更容易。


其实我这样做是因为我懒得记住具体细节。但我决定改变我的懒惰习惯,所以我问了这个问题。(顺便说一句,我没有给你-1) - Jake

2

我这样写(double)a / b是因为我把int想象成像石头一样不可分割的东西。当转换成double类型后,它就可以被分割,就像蛋糕一样。你可以将3.0个蛋糕分成四份,但你不能将三块石头分成4.0份。或者说是这个意思。有道理吗?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接