【发布时间】:2018-01-24 15:43:53
【问题描述】:
在它自己的定义中,后缀运算符是在其所有操作数之后指定的运算符。
在 C11 标准中,后缀运算符定义为:
6.5.2 后缀运算符
语法
postfix-expression: primary-expression postfix-expression [ expression ] postfix-expression ( argument-expression-listopt ) postfix-expression . identifier postfix-expression -> identifier postfix-expression ++ postfix-expression -- ( type-name ) { initializer-list } ( type-name ) { initializer-list , }
-
标准将
.和->前后两部分称为 操作数,我在以下引用中以粗体突出显示。这是否意味着.和->实际上是中缀 运算符,尽管在 标准?6.5.2.3 结构和联合成员
约束
1 第一个操作数。操作员应有一个原子, 合格或不合格的结构或联合类型,以及第二个 操作数应命名该类型的成员。
2 -> 运算符的第一个操作数 应具有类型 “指向原子的、合格的或不合格的结构的指针”或 “指向原子、合格或不合格联合的指针”,以及 第二个操作数应命名指向类型的成员。
-
[]、()和复合文字的小节没有提及 “操作数”这个词。所以-
[]和()都是一元后缀运算符,在它们前面有一个(函数)指针名称作为它们唯一的操作数,而[]和()里面的什么不是操作数?这就是the accpeted reply 所说的In a function call, what is the operator, and what are the operands? - 什么是复合文字的运算符,
()、(type-name)或其他?{}中的initializer-list可能不是操作数,就像[]中的数组索引和()中的函数参数一样。{}可能不是运算符的一部分,因为它用于封装初始化程序。如果复合字面量的操作符是(type-name),复合字面量操作符不带任何操作数吗?
-
-
虽然强制转换运算符不是 C 中的后缀运算符,但它看起来几乎是 与复合文字运算符相同。
6.5.4 转换运算符语法
cast-expression: unary-expression ( type-name ) cast-expression约束 2 除非类型名称指定 void 类型,否则类型名称 应指定原子的、合格的或不合格的标量类型,并且 操作数应为标量类型。
演员运算符
()或(type-name)也是如此吗?是它的操作数cast-expression,或者type-name和cast-expression?
谢谢。
【问题讨论】:
-
我认为 C 标准甚至没有指定后缀运算符,只有后缀表达式。跨度>
-
语言律师问题可能很有趣。但是你最新的好像是“Is an expression an expression”的形式?
-
该标准在任何地方都没有提到“复合文字运算符”,所以我不愿意称它为运算符,即使它位于“后缀运算符”部分。相反,“复合文字”只是一个“后缀表达式”。
-
@Tim:语言定义中所说的它们是什么。
[]运算符的操作数是数组表达式和索引。()运算符的操作数是函数表达式和参数表达式。.和->运算符的操作数是struct(或struct指针)表达式和成员名称。它们与后缀++和--运算符混为一谈,以确保它们都具有相同的优先级。
标签: c operators expression language-lawyer