作者:KristenW_ong_湘 | 来源:互联网 | 2023-01-22 19:36
在它自己的定义中,后缀运算符是在其所有操作数之后指定的运算符.
在C11标准中,后缀运算符定义为:
6.5.2邮政运营商
句法
post?x-expression:
primary-expression
post?x-expression [ expression ]
post?x-expression ( argument-expression-listopt )
post?x-expression . identi?er
post?x-expression -> identi?er
post?x-expression ++
post?x-expression --
( type-name ) { initializer-list }
( type-name ) { initializer-list , }
标准两个部分之前和之后的调用.
,并->
为操作数,这是我用粗体突出表现在以下报价.它是否意味着.
并且->
实际上是中缀运算符,尽管在标准中被称为后缀运算符?
6.5.2.3结构和工会成员
约束
1 的第一个操作数 .运算符应具有原子,限定或不合格的结构或联合类型,第二个操作数应指定该类型的成员.
2 - >运算符的第一个操作数应具有类型''指向原子,限定或不合格结构的指针''或''指向原子,合格或不合格的联合'的指针, 第二个操作数应指定一个成员.类型指向.
对于小节 []
,()
和复合文字不提字"操作数".所以
是[]
和()
两个一元的后缀运算符,在它们之前有一个(函数)指针名称作为它们的唯一操作数,以及内部[]
和()
不是操作数的内容?这是正在进行的回复所说的在函数调用中,运算符是什么,操作数是什么?
什么是复合文字的运算符()
,(type-name)
或其他什么?initializer-list
within {}
可能不是操作数,就像数组索引in []
和函数参数一样()
.{}
可能不是运算符的一部分,因为它用于封装初始值设定项.如果复合文字的运算符是(type-name)
,复合文字运算符是否不采用任何操作数?
虽然转换运算符不是C中的后缀运算符,但它看起来容易混淆,几乎与复合文字运算符相同.
6.5.4转换运算符语法
cast-expression:
unary-expression
( type-name ) cast-expression
约束2除非类型名称指定为void类型,否则类型名称应指定原子,限定或不标准的标量类型,并且
操作数应具有标量类型.
铸造运营商()
还是(type-name)
?是它的操作数
cast-expression
,或两者type-name
并cast-expression
?
谢谢.
1> Jonathan Lef..:
语言规范定义了语法,而不关心你所谓的构成语言的部分.
在abc->def
,第一个操作数是abc
,并且->
是操作符并且def
是第二个操作数,但它被限制为标识符是第一个操作数(可能是完整操作数)的结构或联合的成员的名称postfix-expression
)确定.你不能在->
运算符的RHS上写一般表达式- abc->3
不起作用,也不行abc->(x + y)
.类似的评论适用于.
运营商,比照适用.
如果您想将此视为中缀运算符,则可以这样做.这是你的特权.它无助于您理解标准.
(a)[]
运营商遵循后缀表达; 它是在后缀表达式之后; 这使它成为一个后缀运算符.
(b)()
函数调用运算符遵循后缀表达式; 它是在后缀表达式之后; 这使它成为一个后缀运算符.
(c)复合文字运算符全部是(type){
和}
.由于它{ … }
出现在(type)
部分之后,并且由于它的行为与语法中的其他后缀运算符一样,因此将其视为后缀运算符是合理的.标准说它是一个; 无论如何它真的没关系.语言按指定的方式工作.
转换运算符是单独分组的,是一种"前缀运算符".它们与复合文字不同.演员表达后的表达不能以一个开头{
; 复合文字中"强制表示法"之后的文字只能以a开头{
.是否存在{
决定了构造是铸造还是复合文字.
如果您阅读并理解标准,所有这些都是非常明显的.
(a)和(b)C标准没有说"它是在后缀表达式之后;这使它成为后缀运算符".我也不确定这是什么意思.通常在C之外,如果操作符出现在所有操作数之后,则称为后缀.
标准说,构建后缀表达式的方法之一是:
后缀 [
表达式 ]
从我所在的位置开始," []
运算符遵循后缀表达式;它位于后缀表达式之后;这使得它成为后缀运算符"似乎是对该部分语法的合理准确描述.的[
和]
现有后出现后缀表达式.我不确定你的'后缀运算符'还有什么比'追随某个东西'的运算符',以及[]
'之后'的东西'.
2(c)我从阅读C上的书到目前为止的直觉表明初始化部分不是操作数或运算符,所以我怀疑它{}
是复合文字运算符的一部分.
复合文字由括在圆括号(括号)中的类型名称后跟一个用大括号括起来的初始化列表(大括号)组成.它需要所有这些来制作复合文字.我不知道怎么{}
不能成为复合文字的一部分 - 语法说它是,而且......好吧,如果你想把它当成一个独立的东西,我不能阻止你,但你正在制作这样做会让你自己的生活变得更加困难,并且让那些想要帮助你的人生活变得非常困难.从我的屏幕这一方面来看,你是如何设法想出这些新方法来如此巧妙和狡猾地误解标准的纯文本,这一点并不清楚.