【问题标题】:Cast operation precedence in C#C#中的强制转换操作优先级
【发布时间】:2012-04-13 02:53:30
【问题描述】:

以下差异在 C# 中是否重要?

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

你用的是哪一个?

【问题讨论】:

  • 只要确保你不使用result = (double)(a/b);
  • 这些都不是必需的。 ab 已经是双打了。结果变量是双精度的。唯一不会成为双打的是两个双打的除法结果。如果我没记错的话,在这种情况下会自然地从整数转换为双数。
  • @Ramhound ab 是整数,而不是双精度数。执行result = a / b 将导致整数除法,然后转换为双精度数。

标签: c# casting operator-keyword operator-precedence


【解决方案1】:

演员将在除法之前发生。

在您的示例中,您执行哪个操作数并不重要,就好像一个操作数是双精度数一样,运行时也会将另一个操作数转换/转换为双精度数。

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

【讨论】:

  • 我主要关心的是计算结束时的精度。我担心无论我选择(首先,明确地)选择哪个都会有所作为。但既然你说内部人员会铸造他们每个人,我相信你。
  • @Jake - 信任,但要验证...这是您可以自己轻松测试的东西(只需编写一个执行不同类型计算的小型应用程序)。
  • 其实这个小程序并不能证明什么。一小部分测试操作数不能代表所有可能操作数的结果,除非首先确定它是这样实现的。因此我不得不问这个问题。
【解决方案2】:

我这样做:

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

这可能是完全没有必要的,但通常我想确定它不会进行整数除法,而且我不太关心这种情况的具体规则,所以更容易(如果再敲几下键)要明确。

【讨论】:

  • 其实我正在这样做因为我懒得去记细节。但我决定改变我的懒惰习惯,所以我问了这个问题。 (顺便说一句,我没有给你-1)
【解决方案3】:

我之所以选择(double)a / b,是因为我认为 int 是不可分割的东西,例如岩石或其他东西。当铸造成双倍时,它变得可分割,就像蛋糕一样。你可以把 3.0 块蛋糕分成四份,但你不能把三块石头分成 4.0 份。或者其他的东西。有意义吗?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-15
    • 2021-06-25
    • 1970-01-01
    • 1970-01-01
    • 2014-07-05
    • 1970-01-01
    • 2012-09-02
    相关资源
    最近更新 更多