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

自增自减运算符与逻辑运算符结合的行为及程序输出疑问解析

自增/自减运算符与逻辑运算符结合的工作机制及代码解析

自增、自减运算符本身的工作机制并没有变化,问题出在逻辑运算符的短路求值特性——它会跳过部分表达式的执行,导致你预期的自增操作没发生。

关键知识点:逻辑运算符的短路求值

C语言中逻辑运算符有严格的短路规则:

  • 逻辑或 ||:如果左侧表达式结果为真(非0),右侧表达式会直接被跳过,完全不执行
  • 逻辑与 &&:如果左侧表达式结果为假(0),右侧表达式会直接被跳过,完全不执行
  • 优先级:&& 的优先级高于 ||,所以会先计算 && 关联的表达式,再处理 ||

逐段解析你的代码

第一段代码执行过程

int a = -10, b = 3, c = 0, d;
d = a++ || ++b && c++;
  1. 首先计算 a++:这是后置自增,先返回当前值 -10(非0,视为真)
  2. 因为 || 的左侧已经为真,根据短路规则,右侧的 ++b && c++ 整个表达式直接被跳过,没有任何执行
  3. 最终结果:
    • a 完成自增,变为 -9
    • b 和 c 未被修改,保持 3 和 0
    • d 被赋值为 1(逻辑或的结果为真)

第二段代码执行过程

a = -10, b = 3, c = 0;
d = c++ && ++b || a++;
  1. 先计算 c++:后置自增,先返回当前值 0(视为假)
  2. 因为 && 的左侧为假,短路规则触发,右侧的 ++b 直接跳过,不执行
  3. 此时 && 的结果为 0(假),需要继续计算 || 的右侧表达式 a++
  4. a++ 返回当前值 -10(非0,真),所以 || 的结果为 1,赋值给 d
  5. 最终结果:
    • c 完成自增,变为 1
    • b 未被修改,保持 3
    • a 完成自增,变为 -9
    • d 被赋值为 1

补充说明

自增/自减的行为本身没有改变:只要表达式被执行,后置自增就是先返回原值再自增,前置自增就是先自增再返回新值。你看到的“未按预期自增”,本质是这些自增所在的表达式因为短路求值根本没被运行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 21:57:19