C 操作员的工作++;其次是->;在下面的例子中
考虑下面给出的代码段:C 操作员的工作++;其次是->;在下面的例子中,c,operators,standards,c99,c89,C,Operators,Standards,C99,C89,考虑下面给出的代码段: #包括 结构 { int x; 字符c; }; int main() { 结构sx[2]={{1,'a'},{2,'b'}; 结构s*p; p=x; int a=p++->x;//怀疑线 printf(“%d\n”,a); } 以下代码的输出为1,这表明其实际评估为: inta=((p++)->x); 现在我的问题是,我们知道在C中,二进制->运算符的优先级高于一元+运算符。但是为什么效果是这样的:+先分组,然后再分组-> 是这样的吗?作为一个二元运算符,它会查找其左
#包括
结构
{
int x;
字符c;
};
int main()
{
结构sx[2]={{1,'a'},{2,'b'};
结构s*p;
p=x;
int a=p++->x;//怀疑线
printf(“%d\n”,a);
}
以下代码的输出为1
,这表明其实际评估为:
inta=((p++)->x);
现在我的问题是,我们知道在C中,二进制->
运算符的优先级高于一元+
运算符。但是为什么效果是这样的:+
先分组,然后再分组->
是这样的吗?作为一个二元运算符,它会查找其左侧的第一个操作数,并且它是p
配对,如下所示:
inta=*(p++->x);
但这包括p
,p++
作为一个块,因此首先考虑p++
,但我觉得这个解释有点模糊。有人能给我解释一下正确的逻辑吗?同时,有人能给我推荐一本书,让我可以练习更多这样的例子吗
编辑:
谢谢你的回答,实际上我已经从丹尼斯·里奇等人的《C编程语言》和赫伯特·席尔德的《C-完整参考》中学习了C。在这两种文本中,运算符优先级如下所示:
来源:Dennis Ritchie等人(第53页)“C编程语言(第二版)”后缀增量运算符
++
和通过指针运算符->
的成员访问具有相同的优先级,它们从左到右分组。因此首先计算p++
,然后计算(p++)->x
的第6.5.2p1节给出了后缀运算符的以下语法声明:
您是否使用了前缀递增运算符,即优先级低于
->
的++p->x
,分组为++(p->x)
。因此,您最终将从最初指向的对象p
中获取x
成员,然后该成员将随着表达式的计算而递增到递增的成员。后缀递增运算符++
和通过指针运算符->
访问的成员具有相同的优先级,他们从左到右分组。因此首先计算p++
,然后计算(p++)->x
的第6.5.2p1节给出了后缀运算符的以下语法声明:
您是否使用了前缀递增运算符,即优先级低于
->
的++p->x
,分组为++(p->x)
。因此,您将从最初指向的对象p
中获取x
成员,然后,该成员将使用表达式对递增的成员求值进行递增。运算符后缀++
和->
具有相同的值,但从左到右求值。@WeatherVane感谢您提供的信息。正如我的编辑所显示的那样,在std教科书中没有C语言。C语言是近40年前发展起来的,30年前首次标准化。它已经进化和完善,所以使用最新的教科书很重要。即便如此,有些还是不好。@WeatherVane你能推荐一个好的和最近的吗?请看操作符postfix++
和->
有相同的,但从左到右进行评估。@WeatherVane谢谢你提供的信息。正如我的编辑所显示的那样,在std教科书中没有C语言。C语言是近40年前发展起来的,30年前首次标准化。它已经进化和完善,所以使用最新的教科书很重要。尽管如此,有些是不好的。@风向标你能给我推荐一个好的和最近的吗?请看,谢谢你提供的信息。标准教科书中没有。非常感谢你提供的信息。标准教科书中没有。
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 , }