在它自己的定义中,后缀运算符是在其所有操作数之后指定的运算符。
在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 - >的第一个操作数操作员应具有类型 ''指向原子,合格或不合格结构的指针''或 ''指向原子,合格或不合格的联盟''和的指针 第二个操作数应指定指向该类型的成员。
[]
,()
和复合文字的小节不提
单词" operands"。所以
[]
和()
这两个一元的后缀运算符,在它们之前有一个(函数)指针名称作为它们的唯一操作数,而[]
和()
里面的内容不是操作数?这是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
?
感谢。
答案 0 :(得分:5)
语言规范定义了语法,并不关心你所谓的构成语言的部分。
在abc->def
中,第一个操作数为abc
,->
为运算符,def
为第二个操作数,但限制为标识符为名称第一个操作数(可能是完整的postfix-expression
)标识的结构或联合的成员的类型。您不能在->
运算符的RHS上编写通用表达式 - abc->3
不起作用,abc->(x + y)
也不行。类似的评论适用于.
运算符,加以必要的变更。
如果您想将此视为中缀运算符,则可以这样做。这是你的特权。它不会帮助您理解标准。
(a)[]
运算符遵循后缀表达式;它是在后缀表达式之后;这使它成为一个后缀运算符
(b)()
函数调用运算符遵循后缀表达式;它是在后缀表达式之后;这使它成为一个后缀运算符
(c)复合文字运算符全部是(type){
和}
。由于{ … }
位于(type)
部分之后,并且由于它的行为与语法中的其他后缀运算符相似,因此将其视为后缀运算符是合理的。标准说它是一个;无论如何,它确实无关紧要。语言按指定的方式工作。
将演员操作符分开编组,并使用一种前缀运算符'。它们与复合文字不同。演员表达后的表达式不能以{
开头; “演员记谱法”之后的字面数字'在复合文字中只能以{
开头。 {
的存在与否决定了构造是演员还是复合文字。
如果您阅读并理解标准,所有这一切都非常明显。
- (a)和(b)C标准并没有说"它是在后缀表达之后;这使它成为一个后缀运算符。"我也不确定这是什么意思。通常在C之外,如果操作符出现在所有操作数之后,则称为后缀。
醇>
该标准规定构建后缀表达式的方法之一是:
postfix-expression
[
表达]
我坐在哪里," []
运算符遵循后缀表达式;它是在后缀表达式之后;这使得它成为一个后缀运算符" 似乎是对该部分语法的一个相当准确的描述。 [
和]
出现在先前的后缀表达式之后。我不确定'后缀运算符'你还能理解别的什么?比起'之后的操作员,而[]
来自'
2(c)我迄今为止阅读C上的书籍的直觉表明初始化部分不是操作数或运算符,所以我怀疑
{}
是复合文字运算符的一部分。
复合文字由括在圆括号(括号)中的类型名称后跟一个用大括号括起来的初始化列表(大括号)组成。它需要所有这些来制作复合文字。我不知道{}
怎么不能成为复合文字的一部分 - 语法就是这样,而且......好吧,如果你想把它看作是分开的东西,我可以'停止你,但你这样做会让你自己的生活变得更加困难,并且那些那些想要帮助你的人生活变得非常困难。从屏幕的这一侧看,你是如何设法想出这些新方法来如此巧妙和狡猾地误解标准的纯文本,这一点并不清楚。
答案 1 :(得分:2)
修改强>
我在睡眠不足的情况下运行,加上咖啡过多,所以我的心理过程并没有尽可能清楚地运作,因此我原来的反应就是混乱的污泥。
这些运算符被称为"后缀运算符"因为它们遵循 postfix-expression ,而不是因为它们的操作数的数量或位置。类似地,前缀运算符被称为"一元运算符"因为它们位于一元表达式之前。 "演员和#34;在强制转换表达式之前,"乘法运算符"请遵循乘法表达式等.IOW,运算符是根据它们应用的表达式类型命名的,而不是因为运算符的内在属性。
<强>原始强>
你在某种程度上过度思考。
主要原因()
,[]
,.
,->
和复合文字与后缀++
和--
组合在一起确保它们都具有相同(最高级别)的优先级; &a[i]
,*f(x)
和a + b->c
之类的表达式全部解析为&(a[i])
,*(f(x))
和a + (b->c)
。选择术语&#34;后缀&#34;如果你坚持对其含义 1 迂腐,那么描述这些算子是很不幸的,但它有点在上下文中有意义。他们称之为&#34;后缀运营商的主要原因是&#34;是因为它们遵循 postfix-expression ,而不是因为操作数的数量或位置。
语言标准主要是写得很好且精确,但在某些方面可能更好。这可能是其中一个方面。
<小时/>
*
,&
,++
,--
和sizeof
运算符,即使它们更接近于前缀运算符的概念比后缀运算符。同样,它是因为这些运算符位于一元表达式之前,而不是因为操作数的数量或位置。