Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 操作员的工作++;其次是->;在下面的例子中_C_Operators_Standards_C99_C89 - Fatal编程技术网

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 , }