在维基百科上查找运算符关联性时,我注意到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
有什么关联性?
答案 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 ,其定义为:
删除表达:
:: optdelete
cast-expression
:: optdelete []
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
永远无效。