J.T*_*J.T 1 c pointers operator-precedence
运行此代码:
#include <stdio.h>
int main() {
int x[]={20,30};
int *p=x;
++*p++;
printf("%d %d\n",x[0],*p);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出是21 30,这对我来说没有意义,因为根据C运算符优先级,后缀增量首先出现,但如果在我看来输出应该是20的情况.对于记录我是新的编程,它真的似乎我不能得到它如此抱歉如果这个问题是愚蠢的:)
来自C++标准(同样适用于C标准)
5.2后缀表达式1后缀表达式从左到右分组.
Postfix表达式和p++后缀表达式的优先级高于一元表达式.
C++标准
5.3一元表达式1具有一元运算符的表达式从右到左分组.
在这个表达式中++*p有两个一元子表达式:*p和++( *p )
所以整个表达式可以写成
++( *( p++ ) );
Run Code Online (Sandbox Code Playgroud)
考虑到后缀表达式++(现在它是C标准)
6.5.2.4后缀增量和减量运算符
2 postfix ++运算符的结果是操作数的值.作为副作用,操作数对象的值递增(即,将相应类型的值1添加到其中).
让我们考虑表达式语句的结果
++( *( p++ ) );
Run Code Online (Sandbox Code Playgroud)
subexpression p++具有其操作数的值,该操作数是int *数组的第一个元素的类型的地址.然后由于解除引用,表达式*( p++ )产生数组的第一个元素的左值,x[0]然后它的值增加.所以arry的第一个元素现在的值为21.
同时后缀增量将指针增加p为副作用(参见上面C标准的引用).它现在指向数组的第二个元素.
因此输出将是
21 30
Run Code Online (Sandbox Code Playgroud)