为何变量y、b、c的显示值与算法跟踪结果不符?
问题解答:变量赋值未生效与逻辑表达式求值问题
嘿,这两个问题其实都指向C++里一个很关键的特性——短路求值(Short-circuit Evaluation),咱们一个个拆解清楚:
一、为什么变量y赋值为0却显示5?
先看你代码里的这行核心语句:
res = 7 || (y = 0);
在C++中,逻辑或运算符||遵循短路求值规则:只要左边的表达式结果为「真」(非0值),右边的表达式就会被直接跳过,完全不会执行。
这里左边的7是一个非0整数,在布尔语境下会被判定为true,所以右边的y = 0这条赋值语句根本没有机会运行。y的初始值是5,自然输出还是5。
二、算法跟踪得出b=1、c=1错误结果的原因
这同样是短路求值和运算符优先级共同作用的结果,咱们逐行分析你的代码:
第一个逻辑表达式:res = ++a || ++b && ++c;
首先明确:C++中&&的优先级高于||,但短路求值的优先级更高。
- 第一步执行
++a:a从0变成1(非0,布尔值为true) - 因为
||左边已经是true,根据短路规则,右边的整个++b && ++c表达式会被直接跳过,完全不会执行 - 所以
b和c的初始值0都没有被修改,最终结果是b=0、c=0,而不是你跟踪的1
第二个逻辑表达式:res = ++a && ++b || ++c;
同样结合短路求值分析:
- 第一步执行
++a:a从0变成1(true) - 因为
&&左边是true,所以需要执行右边的++b:b从0变成1(true) - 此时
++a && ++b的结果是true,触发||的短路规则,右边的++c被跳过,不会执行 - 所以最终
c的取值还是0,而非你跟踪的1
简单总结:逻辑运算符&&和||都会在满足条件时短路后续表达式,这是C++为了性能优化设计的特性,但也是容易踩坑的点,写代码时一定要注意这种“部分表达式不执行”的情况。
内容的提问来源于stack exchange,提问作者Sasan Ace
相关产品推荐
相关产品推荐

