为何编译器编译下述代码时未遵循运算符优先级规则?
代码执行结果为3的原因分析
咱们来一步步拆解这段代码的执行逻辑,你之前的误区主要是对运算符优先级和结合性的理解有偏差,导致计算顺序判断错误。先看初始值:int a=10,b=6,c=7;
第一个if语句:if (b%=(a%=b) * c >= 3 * c-b)
你以为会先算完(a%=b)*c再和3*c-b比较,最后执行b%=这个赋值,但实际上赋值运算符的优先级远低于比较运算符(>=),所以这个表达式的计算顺序是:
- 先执行
a%=b:a = 10 % 6 = 4,此时a=4。 - 计算比较表达式
(a%=b)*c >= 3*c - b:- 左边:
4 *7 =28 - 右边:
3*7 -6 =15 - 比较结果
28>=15为真,在C中布尔真用1表示。
- 左边:
- 最后执行
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
相关产品推荐
相关产品推荐

