首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >运算符删除结合性

运算符删除结合性
EN

Stack Overflow用户
提问于 2015-05-20 20:49:45
回答 3查看 96关注 0票数 5

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

5.3一元表达式expr.unary 1)一元运算符的表达式由右向左分组。 一元表达式:后缀-表达式++强制转换-表达式单运算符强制转换-表达式大小(类型-id)大小.(标识符)对齐( type-id )no除-表达式新-表达式删除-表达式一元-运算符之一:*&+-!~之一

这意味着什么?delete到底有什么联想性?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 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组合成一种允许您问出关联性答案的问题的方式。

票数 6
EN

Stack Overflow用户

发布于 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+高,因为在这样的表达式中:

代码语言:javascript
复制
delete x+y

x+y不是一元表达式,所以语法的唯一合法解析将是(delete x) + y

票数 2
EN

Stack Overflow用户

发布于 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从来都不是有效的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30360119

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档