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

时间:2010-04-19 16:36:43

标签: d

有谁知道D版本1.0的运营商优先级列表在哪里?

5 个答案:

答案 0 :(得分:6)

在页面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)

答案 1 :(得分:2)

请参阅D 1.0 page on Expressions

  

评估顺序

     

以下二进制表达式是   严格按照从左到右的方式进行评估   顺序:

     

CommaExpression,OrOrExpression,   AndAndExpression

     

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

     

AssignExpression,OrExpression,   XorExpression,AndExpression,   CmpExpression,ShiftExpression,   AddExpression,CatExpression,   MulExpression,函数参数

     

依赖于顺序是错误的   未指定时的评估。   例如,以下是   非法:

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

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

至少,这是Walter(D创作者)在this mailing list thread中提到的链接。

答案 2 :(得分:1)

据我所知,目前还没有一个很好的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的运营商,查看表达式页面,您已经

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

  •   
        
          

    =

        
      

可能与==

的优先级相同
  • !中
  • !是

与&lt;

相同的优先顺序
  • &LT;!&GT; =
  • &LT;&GT;
  • &LT;&GT;
  • &LT;&GT; =
  • &GT; <!/ LI>
  • &GT;!=
  • &LT; <!/ LI>
  • &LT;!=

与&gt;&gt;

相同的优先顺序
  •   
        

    &GT;

      

可能与*

的优先级相同

我相信这是新D运营商的完整列表。我在其中几个案例中说“可能”,因为它看起来像Mark Rushakoff的答案所引用的实现定义(在这种情况下,如果不相同,优先级非常接近给定的运算符)。但是,我不确定它实际上是否重要,因为以一种非常模糊的方式混合其中一些是非常困难的(特别是 in )。

一般来说,如果你坚持C / C ++优先规则,你应该没问题。如果有的话,由于更严格的转换规则等,D将比C / C ++更具限制性,所以我认为你最终不会有任何额外的含糊之处。尽管如此,建议将明确的运算符优先级表添加到D文档中可能是个好主意。

答案 3 :(得分:0)

谷歌没有找到太多,猜测D是一种小众语言

但是,我确实偶然发现了thread关于从C ++转换为D的评论,其中D的创建者说“转换是我保持运算符优先级相同的一个原因。” 因此,如果您能找到C ++运算符优先级,那么您应该可以将它用于D

答案 4 :(得分:0)

只要有可能,D使用C运算符优先级。