在维基百科上查找运算符结合性时,我注意到delete具有从右到左的结合性。源被引用为msdn,我检查了它,它属于第3组优先级,从右到左结合。所以我检查了C++标准(n4296)
5.3一元表达式expr.unary 1)一元运算符的表达式由右向左分组。 一元表达式:后缀-表达式++强制转换-表达式单运算符强制转换-表达式大小(类型-id)大小.(标识符)对齐( type-id )no除-表达式新-表达式删除-表达式一元-运算符之一:*&+-!~之一
这意味着什么?delete到底有什么联想性?
发布于 2015-05-20 21:05:06
正如Barry所说,优先级是由语法决定的(还有一些运算符与优先级的基本概念不太匹配,所以您只能从语法中完全正确地计算出发生了什么,而不是一个优先级表)。
然而,即使我们忽略了这一点,删除的优先级(至少通常是这样)决定了语句是否合法/允许,而不是它的含义。为了给出一个反例,对于+和*,优先级决定2 * 3 + 4产生10而不是14 (即乘法优先)。
在delete的情况下,delete语句不会产生任何值,因此不允许像delete x + y;这样的语句。它将被解析为(delete x) + y;,但是由于delete x不会产生一个可以添加到任何其他东西中的值,所以结果总是被禁止的(如果您更改操作符,这将保持为真)。
对于delete来说,联想并不是真正有意义的。特别是,结合性处理的是:a @ b @ c将被解析为(a @ b) @ c还是a @ (b @ c) (其中@是某种运算符)。但是,对于使用两个操作数的操作符来说,这才是真正有意义的。根本没有办法将deletes组合成一种允许您问出关联性答案的问题的方式。
发布于 2015-05-20 20:57:39
C++标准通常不按优先级或结合性来定义运算符。它用语法来定义它们。从expr.delete中,delete用于一个delete-表达式,该表达式定义为:
删除-表达式: 备选
delete转换-表达式 备选delete []转换-表达式
其中,强制转换表达式在expr.cast中定义。
演员-表达: 一元表达式
(类型-id)强制转换表达式
一元表达式是一堆定义了expr.unary的东西,它们都是一元表达式(增量、递减、delete本身)。
也就是说,delete *x是从右向左结合的,因为(delete (*x))是根据语法解析表达式的唯一方法。
这也是优先选择引用delete优先级的直接原因。例如,delete比+高,因为在这样的表达式中:
delete x+yx+y不是一元表达式,所以语法的唯一合法解析将是(delete x) + y。
发布于 2015-05-20 21:06:41
联想是关于a op b op c是被解析为(a op b) op c还是a op (b op c)。
delete是一个一元运算符,因此它不能关联。它没有相联性。
而且delete delete x从来都不是有效的。
https://stackoverflow.com/questions/30360119
复制相似问题