C语言后缀自增与指针解引用优先级及*p++运算结果疑问
概念疏漏点说明
你对运算符优先级的判断本身没有错,*p++确实会因为后缀自增优先级更高,被解析为*(p++)而非(*p)++。你出现的误解核心是混淆了运算符优先级的绑定规则和后缀自增运算符的求值返回规则:
- 优先级只决定运算符和操作数的绑定关系,不会改变后缀
++本身的行为逻辑 - 后缀自增运算符的固有规则是:先返回变量当前的原始值,再执行变量的自增操作
*p++执行流程拆解 整个表达式的执行顺序如下:
- 计算
p++子表达式:返回p当前存储的地址(也就是数组首元素a[0]的地址),同时记录要对p执行自增操作 - 对
p++返回的原始地址执行解引用操作,拿到的值就是a[0]的3,这就是printf输出的内容 - 最后完成p的自增:p的地址向后偏移1个int类型的长度,指向
a[1]也就是10的地址
对比验证
你可以通过以下不同写法验证规则:
#include <stdio.h> int main() { int a[] = {3, 10, 200}; int *p = a; // 输出3,执行后p指向a[1] printf("%d\n", *p++); // 此时p已经指向a[1],输出10 printf("%d\n", *p); // 重置p p = a; // 前缀++先自增再返回,输出10 printf("%d\n", *++p); // 重置p p = a; // 优先级低先解引用,输出3,执行后a[0]变为4,p不变 printf("%d\n", (*p)++); printf("%d\n", a[0]); // 输出4 return 0; }
内容的提问来源于stack exchange,提问作者user12421304
相关产品推荐
相关产品推荐

