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

if…else语句内指针自增异常问题求助

问题根源:表达式中的未定义行为

兄弟,这问题我太熟了!你遇到的是C语言里典型的未定义行为——在同一个表达式里,你既修改了pointer的值(pointer++),又在同一表达式的其他位置读取了pointer,这种情况C标准完全不规定执行顺序,编译器怎么处理都合法,结果自然就会和你预期不符。

原写法的问题出在哪?

看你else分支的代码:

*(pointer++) = *(pointer-12);

这个表达式里有两个和pointer相关的操作:

  • pointer++:会把pointer的值自增1(修改操作)
  • pointer-12:会读取当前pointer的值来计算偏移(读取操作)

编译器完全可以选择先执行pointer++,再计算pointer-12。这时候pointer已经比原来大1了,pointer-12就等于你原本预期的pointer-11,正好对应你看到的错误行为——赋值的是*(pointer-11)而不是*(pointer-12)。

至于if分支看起来正常,纯粹是运气好,编译器的执行顺序刚好凑成了你想要的结果,但这同样是未定义行为,哪天换个编译器、调个优化等级,if分支也可能出问题。

拆分写法为什么没问题?

当你把pointer++单独拆出来之后:

if(....)
{ *(pointer)=*(pointer-12)+1; }
else { *(pointer)=*(pointer-12); }
pointer++;

这里对pointer的修改和读取被分到了不同的表达式里,中间有序列点(if/else语句执行完毕后,就是一个明确的序列点)。C标准保证,序列点之前的所有操作都会完全完成,之后的操作基于更新后的值。

所以*(pointer)=*(pointer-12)里的pointer是未修改的原始值,赋值完成后再执行pointer++,逻辑完全清晰,没有任何歧义,自然就正常了。

最后提个醒

永远别在同一个表达式里对同一个变量同时做修改和读取(除非是a = a + 1这种明确依赖自身值的操作),未定义行为是C代码里的隐形炸弹,今天正常明天就可能崩,你的拆分写法是正确的,就这么用!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 15:12:34