代码之家  ›  专栏  ›  技术社区  ›  Winter

d运算符优先级(版本1.0)

d
  •  4
  • Winter  · 技术社区  · 15 年前

    有人知道D版本1.0的操作员优先级列表在哪里吗?

    5 回复  |  直到 13 年前
        1
  •  6
  •   kennytm    13 年前

    在页面中 http://www.digitalmars.com/d/1.0/expression.html 一般来说,优先级越高,优先级越低。要获得特定的优先级,请遵循解析器规则。

    15.   typeof() typeid() is()
          assert() import() mixin()
          function delegate
          T.x x!y
          variables
          (...) [...]       //(Primary expressions)
          "x" "y"           //(Concatenation between string literals)
    14.   . x++ x--
          x() x[]           //(Postfix operators)
    13.   & ++x --x * 
          +x -x ! ~ (T).
          new delete
          cast              //(Prefix operators)
    12½.  ^^                //(Power. D2 only)
    12.   * / %            ///(Multiplicative operators)
    11.   + - ~             //(Additive operators)
    10.   >> << >>>         //(Bitwise shift)
     9.   == != is !is
          > < >= <=
          !> !< !>= !<=
          <> !<> <>= !<>=
          in !in            //(Comparison operators)
     8.   &                 //(Bitwise AND)
     7.   ^                 //(Bitwise XOR)
     6.   |                 //(Bitwise OR)
     5.   &&                //(Logical AND)
     4.   ||                //(Logical OR)
     3.   ?:                //(Conditional operator)
     2.   op=               //(Assignment operator)
     1⅔.  =>                //(Lambda. D2 only. Not really an operator)
     1⅓.  ..                //(Slicing. Not really an operator)
     1.   ,                 //(Comma operator)
    
        2
  •  2
  •   Mark Rushakoff    15 年前

    D 1.0 page on Expressions .

    估价顺序

    以下二进制表达式是 严格从左到右评估 秩序:

    COMMAexpression、ORORORRExpression和 和表达

    以下二进制表达式是 在定义的实现中评估 秩序:

    赋值表达式,或表达式, XoreXpression,and表达式, cmexpression、shiftexpression和 addExpression、cateExpression和 多表达式,函数参数

    这是一个错误,取决于 未指定时的计算。 例如,以下是 非法:

    i = i++;
    c = a + (a = b);
    func(++i, ++i);
    

    如果编译器可以确定 表达式的结果是非法的 取决于评估顺序, 它可以发出错误(但不是 要求)。探测能力 这些错误是 实施问题。

    至少,这是Walter(d Creator)在 this mailing list thread .

        3
  •  1
  •   Jonathan M Davis    15 年前

    据我所知,目前没有一个很好的D运算符优先表。您可以在表达式上查看该页。( http://www.digitalmars.com/d/1.0/expression.html )然后根据语法分解出你所拥有的任何表达式,并找出它,但显然这不像一张表那么好或简单。

    然而,C和C++代码既保证是具有相同行为的有效D代码,也不会编译。所以,只要你的表达式将是有效的C或C++,你就可以只使用C/C++运算符优先级表: http://www.cppreference.com/wiki/operator_precedence

    因此,虽然目前还没有一个很好的D操作符优先级表,只要您理解C/C++操作符优先级,就不应该有任何意外。

    编辑: 对于特定于d的运算符,在“表达式”页中,

    与其他赋值运算符的优先级相同

    • =

    可能与==

    • 在里面
    • !在里面
    • !是

    与<优先级相同

    • !& & =
    • !&;
    • <>
    • <>=
    • !gt;
    • !=
    • !&;
    • !& =

    与>>优先级相同

    • >

    可能与*

    • ~

    我相信这就是新的D操作符的完整列表。在这些情况下,我会说“可能”,因为它看起来像是由Mark Rushakoff的答案中引用的实现(在这种情况下,如果不相同,优先级非常接近给定的运算符)。但是,我不确定这是否真的有关系,因为很难以一种完全不明确的方式混合其中的一些内容(尤其是 在里面 )

    一般来说,如果你坚持C/C++优先规则,你应该是好的。如果有的话,由于严格的转换规则,D将比C/C++更具限制性,所以我不认为你会有任何额外的歧义。不过,建议在D文档中添加一个显式的运算符优先表可能是一个好主意。

        4
  •  0
  •   Chris Hulan    15 年前

    谷歌没有发现太多,猜测D是一种有点利基的语言。

    但是,我确实在 thread 在从C++到D的转换中,D的创建者说:“转换是我保持操作符优先级相同的原因之一。” 因此,如果您可以找到C++运算符优先级,则应该能够使用它作为D

        5
  •  0
  •   Bernard    15 年前

    在可能的情况下,D使用C运算符优先级。