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

为何编译器编译下述代码时未遵循运算符优先级规则?

代码执行结果为3的原因分析

咱们来一步步拆解这段代码的执行逻辑,你之前的误区主要是对运算符优先级和结合性的理解有偏差,导致计算顺序判断错误。先看初始值:int a=10,b=6,c=7;

第一个if语句:if (b%=(a%=b) * c >= 3 * c-b)

你以为会先算完(a%=b)*c再和3*c-b比较,最后执行b%=这个赋值,但实际上赋值运算符的优先级远低于比较运算符(>=),所以这个表达式的计算顺序是:

  1. 先执行a%=b:a = 10 % 6 = 4,此时a=4。
  2. 计算比较表达式(a%=b)*c >= 3*c - b:
    • 左边:4 *7 =28
    • 右边:3*7 -6 =15
    • 比较结果28>=15为真,在C中布尔真用1表示。
  3. 最后执行b %= 1:b =6 %1=0,此时b=0。而赋值表达式b%=...的结果是左值的最终值,也就是0,所以第一个if的条件为假,不会执行printf("1")。

第二个if语句:else if (a ? b : c == 0)

这里的误区是三元运算符(?:)的优先级低于相等运算符(==),所以这个表达式等价于a ? b : (c == 0),而不是(a ? b : c) ==0:

  • a=4(非0,为真),所以取b的值,也就是0。
  • 整个表达式的结果是0,条件为假,不会执行printf("2")。

第三个if语句:else if (c = c || a&&b)

逻辑运算符的优先级是&&高于||,所以先算a&&b:

  • a=4,b=0,a&&b结果为0。
  • 再算c || 0:c=7(非0),结果为1。
  • 最后执行赋值c=1,赋值表达式的结果是1(真),所以条件成立,执行printf("3"),这就是最终输出3的原因。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 21:22:34