You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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++),执行顺序是:

  1. 先读取当前指针p指向的内存值(用来做条件判断);
  2. 再把指针p的地址自增1(指向数组的下一个元素);
  3. 最后用第一步拿到的值和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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:35:11