C语言算术指针后自增输出原理验证及代码分析
验证C语言函数输出的推导逻辑
先把完整的函数代码贴出来,方便咱们对照分析:
void x(){ int x[] = {9, 8, 7, 6, 5, 4, 3, 2, 1}; int *p = x + 1; while (*p++ >5) printf ("%d ", *p); printf ("\n"); }
接下来咱们顺着代码执行顺序,结合C语言运算符优先级与结合性拆解每一步,搞清楚为什么输出是7 6 5:
1. 初始状态梳理
- 数组
x的元素依次是{9, 8, 7, 6, 5, 4, 3, 2, 1},首地址对应&x[0]。 - 指针
p被赋值为x + 1,也就是直接指向数组的第二个元素x[1],此时*p的值是8。
2. 核心:*p++ >5的运算规则
这里是最容易踩坑的地方,必须明确:后缀++运算符的优先级高于一元*运算符,而且后缀++是「先取值,再自增指针」的逻辑。换句话说,*p++等价于*(p++),执行顺序是:
- 先读取当前指针
p指向的内存值(用来做条件判断); - 再把指针
p的地址自增1(指向数组的下一个元素); - 最后用第一步拿到的值和
5比较,决定是否进入循环体。
3. 逐次模拟循环执行
咱们一步一步走循环流程:
- 第一次循环:
- 条件判断:
*p++ >5→ 先取*p=8,然后p指向x[2](值为7);8>5成立,进入循环体。 - 执行
printf("%d ", *p):此时p已经指向x[2],输出7。
- 条件判断:
- 第二次循环:
- 条件判断:
*p++ >5→ 先取*p=7,然后p指向x[3](值为6);7>5成立,进入循环体。 - 执行
printf("%d ", *p):输出6。
- 条件判断:
- 第三次循环:
- 条件判断:
*p++ >5→ 先取*p=6,然后p指向x[4](值为5);6>5成立,进入循环体。 - 执行
printf("%d ", *p):输出5。
- 条件判断:
- 第四次循环:
- 条件判断:
*p++ >5→ 先取*p=5,然后p指向x[5](值为4);5>5不成立,循环终止。
- 条件判断:
最后执行printf("\n"),函数结束。
结论
最终输出确实是7 6 5,题目给出的推导逻辑完全正确。
内容的提问来源于stack exchange,提问作者Toni He
相关产品推荐
相关产品推荐

