操作员删除关联性

时间:2015-05-20 20:49:45

标签: c++ operators

在维基百科上查找运算符关联性时,我注意到delete具有从右到左的关联性。来源被引用为msdn,我检查了它,它来自第3组优先级,从右到左的关联性。所以我检查了the C++ standard (n4296)

  

5.3一元表达式[expr.unary]

     

1)具有一元操作符的表达式从右到左分组

unary-expression:
    postfix-expression
    ++ cast-expression
    -- cast-expression
    unary-operator cast-expression
    sizeof unary-expression
    sizeof ( type-id )
    sizeof ... ( identifier )
    alignof ( type-id )
    noexcept-expression
    new-expression
    delete-expression
unary-operator: one of
    * & + - ! ~

这有什么影响? delete有什么关联性?

3 个答案:

答案 0 :(得分:6)

正如Barry所说,优先权取决于语法(并且有一些运算符与优先级的基本概念不太匹配,所以你只能从语法中找出完全正确的结果,而不是优先表)。

然而,即使我们忽略了这一点,只有删除的优先级(至少通常是)确定一个语句是合法/允许的,而不是它的含义。为了给出反例,使用function updateOutput() { var selects = document.getElementsByTagName('SELECT'); var output = document.getElementById('output'); var arr = []; for (i=0; i < selects.length; i++) { arr.push(selects[i].options[selects[i].selectedIndex].text); } output.innerHTML = arr.join('; '); return arr; } +,优先级确定*产生10而不是14(即乘法优先)。

2 * 3 + 4的情况下,delete语句不会产生任何值,因此不允许使用delete之类的语句。它将被解析为delete x + y;,但由于(delete x) + y;不会产生可以添加到其他任何内容的值,因此结果始终被禁止(如果您更改运算符,那么它将保持为真)

关联对delete x没有意义。特别是,关联性处理的是:delete之类的内容是否会被解析为a @ b @ c(a @ b) @ c(其中a @ (b @ c)是某个运算符)。这对于那些采用两个操作数的运算符来说真的很有意义。根本没有办法将@组合成一种允许你提出关联性回答问题的方法。

答案 1 :(得分:2)

C ++标准通常不会根据优先级或关联性来定义运算符。它根据语法定义它们。从[expr.delete]开始,delete用于 delete-expression ,其定义为:

  

删除表达
  :: opt delete cast-expression
  :: opt delete [] cast-expression

cast-expression 在[expr.cast]中定义:

  

铸表达:
  一元表达式
  ( type-id ) cast-expression

一元表达式是一大堆定义的东西[expr.unary],它们都是一元表达式(递增,递减,delete s本身)

也就是说,delete *x是从右到左关联的,因为(delete (*x))是根据语法解析该表达式的唯一方法。

这也是cppreference引用delete优先权的原因,其直接后果就是{{3}}。例如,delete高于+,因为在这样的表达式中:

delete x+y

x+y不是一元表达式,因此唯一合法的语法分析是(delete x) + y

答案 2 :(得分:1)

关联性是指将a op b op c解析为(a op b) op c还是a op (b op c)

delete是一元运算符,因此无法关联。它没有相关性。

delete delete x永远无效。