自增自减运算符与逻辑运算符结合的行为及程序输出疑问解析
自增/自减运算符与逻辑运算符结合的工作机制及代码解析
自增、自减运算符本身的工作机制并没有变化,问题出在逻辑运算符的短路求值特性——它会跳过部分表达式的执行,导致你预期的自增操作没发生。
关键知识点:逻辑运算符的短路求值
C语言中逻辑运算符有严格的短路规则:
- 逻辑或
||:如果左侧表达式结果为真(非0),右侧表达式会直接被跳过,完全不执行 - 逻辑与
&&:如果左侧表达式结果为假(0),右侧表达式会直接被跳过,完全不执行 - 优先级:
&&的优先级高于||,所以会先计算&&关联的表达式,再处理||
逐段解析你的代码
第一段代码执行过程
int a = -10, b = 3, c = 0, d; d = a++ || ++b && c++;
- 首先计算
a++:这是后置自增,先返回当前值-10(非0,视为真) - 因为
||的左侧已经为真,根据短路规则,右侧的++b && c++整个表达式直接被跳过,没有任何执行 - 最终结果:
a完成自增,变为-9b和c未被修改,保持3和0d被赋值为1(逻辑或的结果为真)
第二段代码执行过程
a = -10, b = 3, c = 0; d = c++ && ++b || a++;
- 先计算
c++:后置自增,先返回当前值0(视为假) - 因为
&&的左侧为假,短路规则触发,右侧的++b直接跳过,不执行 - 此时
&&的结果为0(假),需要继续计算||的右侧表达式a++ a++返回当前值-10(非0,真),所以||的结果为1,赋值给d- 最终结果:
c完成自增,变为1b未被修改,保持3a完成自增,变为-9d被赋值为1
补充说明
自增/自减的行为本身没有改变:只要表达式被执行,后置自增就是先返回原值再自增,前置自增就是先自增再返回新值。你看到的“未按预期自增”,本质是这些自增所在的表达式因为短路求值根本没被运行。
内容的提问来源于stack exchange,提问作者FreeDragon
相关产品推荐
相关产品推荐

