代码之家  ›  专栏  ›  技术社区  ›  Julien Grenier

Java操作员优先准则

  •  20
  • Julien Grenier  · 技术社区  · 7 年前

    误解 Java运算符优先级 是常见问题和细微错误的来源。我很想知道 Java Language Specification 说:“建议代码不要关键依赖于这个规范。” JLS §15.7 偏爱 清楚的 聪明的 ,这方面有什么有用的指导方针吗?

    以下是有关该主题的一些资源:

    欢迎添加或更正。

    6 回复  |  直到 12 年前
        1
  •  20
  •   sblundy    12 年前

    就“现实世界”而言,公平地说:

    • 足够多的程序员知道乘法/除法优先于加法/减法,正如数学上的惯例一样。
    • 几乎没有一个程序员能记住其他的优先规则

    所以,除了 */ 虚拟 +- ,我真的只是使用括号来明确定义预期的优先级。

        2
  •  5
  •   iter    16 年前

    另一个相关的bug来源是舍入错误是如何累积的。这本身不是一个运算符优先顺序问题,而是一个惊喜的来源,当您以算术上等价的方式重新排列操作数后得到不同的结果。这是一个sun.com版的David Goldberg's What Every Computer Scientist Should Know About Floating-Point Arithmetic .

        3
  •  4
  •   Museful    9 年前

    引用(来自 Java Language Specification §15.7 )应该在 Evaluation Order . 如讨论 here ,该部分涉及 估价单 ,与操作员无关 优先 (或) 结合性 )

    优先级和关联性影响 结构 表达式树(即哪些运算符作用于哪些操作数),而“计算顺序”只影响表达式树的顺序。 横穿 计算表达式时。除非某些子表达式具有影响其他子表达式结果(或副作用)的副作用,否则计算顺序(或“遍历顺序”)不起任何作用。

    例如,如果x最初=1,则表达式 ++x/++x 将评估为2/3(其评估为0),因为Java已经左到右的评价顺序。如果Java中的评估顺序是从右到左,则在评估分子之前,X会被加倍两次,并且表达式将被评估为3/2(计算为1)。如果计算顺序未定义,则表达式可以对这些结果中的任何一个进行计算。

    有问题的引文及其上下文…

    Java编程语言保证了操作数。 操作员似乎按照特定的评估顺序进行评估, 也就是说,从左到右。

    建议代码不要严重依赖于本规范。 当每个表达式最多包含一面时,代码通常更清晰。 效果,作为其最外层的操作

    ……劝阻读者从爪哇的左到右 估价单 (如上例所示)。它不鼓励不必要的括号。

    编辑:资源: Java operator precedence table 它还可以作为包含语法的JLS部分的索引,从中可以推断每个优先级。

        4
  •  2
  •   kutschkem    13 年前

    此外,不要忘记逻辑&&和是快捷方式运算符,请避免以下情况:

    sideeffect1() || sideeffect2()
    

    如果sideffect1()的计算结果为true,则不会执行sideffect2()。同样适用于&和FALSE。这并不完全与进位有关,但在这些极端情况下, 异能性 也可能是一个重要的方面,通常是真正无关的(至少就我而言)

        5
  •  2
  •   Jingguo Yao    13 年前

    这个 JLS 不提供显式运算符优先级表;当 JLS 描述各种运算符。例如,语法 ShiftExpression 是这样的:

    ShiftExpression:
        AdditiveExpression
        ShiftExpression << AdditiveExpression
        ShiftExpression >> AdditiveExpression
        ShiftExpression >>> AdditiveExpression
    

    这意味着加法运算符( + - )优先级高于左关联移位运算符( << , >> >>> )

        6
  •  1
  •   EJP    13 年前

    在我看来,事实是“大多数程序员”认为“大多数其他程序员”不知道或不记得运算符优先级,所以他们沉溺于“插入缺少括号”的所谓“防御编程”,只是为了“澄清”这一点。记住这三年级的东西是不是一个真正的问题是另一个问题。这一切完全是在浪费时间,如果有什么让事情变得更糟,这也是可以争辩的。我个人的观点是,尽可能避免冗余语法,计算机程序员应该知道他们正在编程的语言,也可能提高他们对同事的期望。

    推荐文章