C++ if语句逻辑运算规则及示例代码输出为1的原因问询
核心前提:C++运算符优先级与求值规则
- 优先级从高到低:算术运算符(减号
-)> 逻辑与&&> 赋值运算符= - 逻辑与
&&、逻辑或||都遵守短路求值规则,且运算符左侧执行完成后有明确序列点,所有左侧的变量修改副作用都会在右侧执行前生效。
代码逐步骤执行逻辑
你提供的代码如下:
int a = 2; if((a = a-3 && --a ) || a--) cout<<a<<endl;
执行步骤:
- 初始值:
a = 2 - 先计算逻辑或
||的左侧表达式(a = a-3 && --a):- 按照优先级先算
a-3:计算结果为-1,这个操作不会修改a的值,此时a仍为2 - 逻辑与
&&左操作数-1为真,触发右操作数--a执行:a自减1变为1,--a表达式的结果为1 - 逻辑与
&&两边都为真,运算结果为1 - 最后执行赋值操作
a = 1,此时a被修改为1,整个左侧表达式的结果为1(布尔真)
- 按照优先级先算
- 逻辑或
||左操作数为真,触发短路规则,右侧的a--不会执行 - if条件成立,输出此时的
a值,也就是1
逐个解答你的疑问
- 逻辑或表达式的左侧实际求值结果是
1(对应布尔值真),你之前的误区是搞错了运算符优先级,并不是把a-3的结果赋值给a,而是先算完a-3 && --a的结果后再赋值给a。 - 如果编译器需要执行逻辑或的右侧运算,一定会使用左侧运算修改后的a值,因为逻辑或左侧执行完成后有明确的序列点,所有变量修改的副作用都会完成。
- 代码输出为1的原因就是上述执行步骤的结果,逻辑或右侧没有执行,a最终的值就是左侧赋值后的1。
- C++中只有
&&和||是短路求值运算符:&&左操作数为假时不会执行右侧;||左操作数为真时不会执行右侧,其余普通运算符不会有这种仅执行一侧的规则。
内容的提问来源于stack exchange,提问作者Karan
相关产品推荐
相关产品推荐

