C语言中j*=i==2与j=j*i==2行为差异的原因咨询
两段C代码行为差异的原因:运算符优先级与结合性
你的推测结果完全正确,两段代码的行为差异确实是由运算符优先级和结合性决定的,下面详细拆解执行逻辑:
关键运算符优先级(从高到低)
- 乘法运算符
*(优先级12) - 相等性运算符
==(优先级9) - 赋值运算符
=、复合赋值运算符*=(优先级14,最低)
注:赋值类运算符(
=、*=等)均为右结合,即从右往左解析表达式。
第一段代码执行逻辑
int i=2,j=3; if (j*=i == 2){ printf("yes, i= %d, j= %d",i,j); } else { printf("no, i= %d, j= %d",i,j); }
- 优先执行
==运算:i == 2的结果为1(C语言中布尔真用int类型的1表示); - 再执行复合赋值
j *= 1,等价于j = j * 1,j原值为3,计算后仍为3; - 整个表达式
j*=i ==2的值为3(非0),if条件成立,输出:yes, i= 2, j= 3。
第二段代码执行逻辑
int i=2,j=3; if (j=j*i == 2){ printf("yes, i= %d, j= %d",i,j); } else { printf("no, i= %d, j= %d",i,j); }
- 优先执行
*运算:j * i = 3 * 2 = 6; - 再执行
==运算:6 == 2的结果为0(布尔假用int类型的0表示); - 最后执行赋值
j = 0,整个表达式的值为0,if条件不成立,输出:no, i= 2, j= 0。
总结
两段代码的本质差异在于运算顺序:
j*=i ==2中,==优先级高于*=,先比较再执行复合赋值;j=j*i ==2中,*优先级高于==,==又高于=,所以先做乘法、再做比较、最后执行赋值。
内容的提问来源于stack exchange,提问作者tariqalr
相关产品推荐
相关产品推荐

