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

C++ if语句逻辑运算规则及示例代码输出为1的原因问询

核心前提:C++运算符优先级与求值规则

  • 优先级从高到低:算术运算符(减号-)> 逻辑与&& > 赋值运算符=
  • 逻辑与&&、逻辑或||都遵守短路求值规则,且运算符左侧执行完成后有明确序列点,所有左侧的变量修改副作用都会在右侧执行前生效。

代码逐步骤执行逻辑

你提供的代码如下:

int a = 2;
if((a = a-3 && --a ) || a--) 
    cout<<a<<endl;

执行步骤:

  1. 初始值:a = 2
  2. 先计算逻辑或||的左侧表达式(a = a-3 && --a):
    • 按照优先级先算a-3:计算结果为-1,这个操作不会修改a的值,此时a仍为2
    • 逻辑与&&左操作数-1为真,触发右操作数--a执行:a自减1变为1,--a表达式的结果为1
    • 逻辑与&&两边都为真,运算结果为1
    • 最后执行赋值操作a = 1,此时a被修改为1,整个左侧表达式的结果为1(布尔真)
  3. 逻辑或||左操作数为真,触发短路规则,右侧的a--不会执行
  4. if条件成立,输出此时的a值,也就是1

逐个解答你的疑问

  • 逻辑或表达式的左侧实际求值结果是1(对应布尔值真),你之前的误区是搞错了运算符优先级,并不是把a-3的结果赋值给a,而是先算完a-3 && --a的结果后再赋值给a。
  • 如果编译器需要执行逻辑或的右侧运算,一定会使用左侧运算修改后的a值,因为逻辑或左侧执行完成后有明确的序列点,所有变量修改的副作用都会完成。
  • 代码输出为1的原因就是上述执行步骤的结果,逻辑或右侧没有执行,a最终的值就是左侧赋值后的1。
  • C++中只有&&和||是短路求值运算符:&&左操作数为假时不会执行右侧;||左操作数为真时不会执行右侧,其余普通运算符不会有这种仅执行一侧的规则。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 00:57:02