代码之家  ›  专栏  ›  技术社区  ›  Swift - Friday Pie

交换数学运算的阶

  •  0
  • Swift - Friday Pie  · 技术社区  · 6 年前

    我有一个奇怪的问题(在阅读一段粗糙的代码时自己问)。让我们看看表达式:

    double a =  c*d*e*2/3*f;
    

    其中c、d、e、f是类型为的初始化变量 double 。标准是否保证将其视为 c*d*e*2 (双重结果)然后除以 3 并乘以 f (或类似的行为)。显然,将2/3计算为0是不可取的。

    标准的哪一段对此进行了定义?

    3 回复  |  直到 6 年前
        1
  •  2
  •   Joseph D.    6 年前

    基于 standard

    [简介摘要]-注7 (非规范性):

    MDA的数学规则是从左到右(考虑到运算符的关联性和优先级)。因此,评估如下:

    (((((c * d) * e) * 2) / 3) * f)
    
        2
  •  2
  •   Mureinik    6 年前

    总之,是的。

    您要查找的属性称为运算符关联性。它定义了具有相同优先级的运算符(例如 * / )在不存在括号的情况下进行分组和排序。

    就你而言,两者 * / c 将乘以 d ,则结果为 e ,则结果为 2 (这将通过浮点运算完成,因为您将 double 通过 int 文字),然后除以 3 (同样,使用浮点运算)并最终乘以 f

    看见 this cppreference page 了解更多信息。

        3
  •  1
  •   Mor A.    6 年前

    二者都 * / 具有相同的优先级,并且从左到右关联,这意味着

    a*b*c*d
    

    解析为

    ((a*b)*c)*d
    

    如果您更换 * 具有

    资料来源: http://en.cppreference.com/w/cpp/language/operator_precedence

    推荐文章