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

为何C语言中该for循环提前终止?两段指针代码差异解析

两段代码的差异与第一段循环提前终止的原因

核心差异

两段代码的核心区别仅在于for循环的增量语句:

  • 第一段使用 *m++
  • 第二段使用 i++

第一段循环提前终止的原因

问题出在*m++的执行逻辑上——C语言中后置++的优先级高于解引用*,所以这个表达式等价于*(m++),实际执行两个操作:

  1. 先将指针m本身向后移动一个int类型的内存长度(指向变量i之后的未知内存区域);
  2. 对m原来指向的地址(即&i)解引用,但这个值会被直接丢弃,完全没有修改i的数值。

具体执行流程:

  1. 第一次循环:
    • 初始化m = &i,*m的值为5,满足<10的条件,执行printf输出5;
    • 执行*m++,指针m移动到i之后的内存,i的数值仍为5。
  2. 第二次循环:
    • 判断条件*m <10:此时m指向未初始化的垃圾内存,本次运行中该内存的随机值恰好为5,满足条件,再次输出5;
    • 执行*m++,指针m继续向后移动。
  3. 第三次循环:
    • m指向的垃圾值大于等于10,条件不满足,循环直接终止。

而第二段代码用i++作为增量语句,每次循环都会修改i的数值,指针m始终指向i,因此*m能正确获取i的更新值,循环会从5执行到9,最后输出10,符合预期。

内容的提问来源于stack exchange,提问作者Kitan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 14:10:22