++*p ++无法理解优先级

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的情况.对于记录我是新的编程,它真的似乎我不能得到它如此抱歉如果这个问题是愚蠢的:)

Vla*_*cow 8

来自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)