【问题标题】:Operator precedence in C#C#中的运算符优先级
【发布时间】:2010-07-19 09:59:20
【问题描述】:

(int)(int1 / (float)var2.Count() * 100)

相当于

(int)((int1 / (float)var2.Count()) * 100)

...它会使用浮点除法还是整数除法?

编辑...如果上面的答案是肯定的,那么在这里执行浮点除法有什么好处?

【问题讨论】:

    标签: c# operator-precedence


    【解决方案1】:

    /* 在 §7.2.1 下具有相同的运算符优先级,因此两个结果应该相同(使用 float 规则)。

    然而,我懒得去学习优先表;我只是使用括号。然后它可以在任何语言中工作,而无需记住它。

    另一个重要的问题是最终(int) 演员表中的四舍五入:您认为是“向上”、“向下”还是“银行家”?

    【讨论】:

    • 好问题重新四舍五入 - 不幸的是我不知道预期的结果。知道为什么实现者会使用浮点除法而不是整数除法来避免强制转换吗?
    • @Ben;想象计数是 3。1/3(使用整数)是00*1000,这不是预期的答案。 1/(float)30.33 等,在乘法和强制转换之后给出 33 - 我假设这是一个 %?实际上,我会使用decimal
    【解决方案2】:

    记住优先级规则真的很烦人,所以我也更喜欢使用方括号来消除歧义。我尝试遵循“首先为人编写代码,其次是计算机”的建议。但是,有一个有趣的助记符(我从 Bruce Eckel 的书中学到的)来记住(一些)规则:“溃疡瘾君子真的很喜欢 C 很多”:

    Ulcer   - Unary (+, -, ++, --, !)
    Addicts - Arithmetic (and shift) (+, -, *, /, %, <<, >>)
    Really  - Relational (<, >, ==, <=, >=, !=)
    Like    - Logical (and bitwise) (&&, ||, &, |, ^)
    C       - Conditional ( ? : ) <- this is the conditional ternary operator
    A lot   - Assignment ( =, *=, +=, ...)
    

    这并不完美,按位运算符被挤进去了,我们必须知道乘法运算符(*、/、%)优先于加法运算符(+、-)。

    【讨论】:

    • 并且强制转换是一元表达式。
    【解决方案3】:

    它们是等价的,它将使用浮点除法。即使先进行乘法运算,也会使用浮点除法,因为 int 除以 float*int 的结果,即 float。

    编辑:

    如果上面的答案是肯定的,那么在这里执行浮点除法有什么好处?

    这是优势吗?您应该考虑的第一件事是它是否正确,因为结果会有所不同。从代码来看,您似乎正在尝试计算某个百分比。使用整数除法时,如果 "int1" 始终小于 var2.Count(),则结果将始终为 0,这可能不是您想要的。

    【讨论】:

      【解决方案4】:

      我会说是的,除法和乘法应该从左到右。因此它是一个浮点除法。

      PS:尽可能将float 替换为double

      【讨论】:

        【解决方案5】:
        【解决方案6】:

        都是一样的。两者都将使用浮点除法。

        【讨论】:

          【解决方案7】:

          是的,两者都是等价的。

          两者都将使用浮点除法。

          【讨论】:

            【解决方案8】:

            整数除法只会返回答案的全部部分,即 3/2 将为 1,而浮点除法将为您返回 1.5

            【讨论】:

              猜你喜欢
              • 2013-02-24
              • 2017-06-02
              • 1970-01-01
              • 2013-02-09
              • 1970-01-01
              • 2021-03-29
              相关资源
              最近更新 更多