首页 分享 = 和 == 的优先级

= 和 == 的优先级

来源:花匠小妙招 时间:2024-11-26 18:36

有如下代码:

int a = 9; int b = 3; if(a = b == a) printf("??n");

这里出现了=和==两个运算符,该先结合哪一个呢?

如果不能上网,且身边没有参考书,那么可以查看汇编代码来探究下=和==的优先级。

;19: int a = 9; mov dword ptr [ebp-0Ch],9 ;20: int b = 3; mov dword ptr [ebp-10h],3 ;21: if(a = b == a) mov eax,dword ptr [ebp-10h] ; b -> eax xor ecx,ecx ; 0 -> ecx cmp eax,dword ptr [ebp-0Ch] ; cmp b, a sete cl ; ?? mov dword ptr [ebp-0Ch],ecx cmp dword ptr [ebp-0Ch],0 je main+47h .....

可看到,cmp指令的操作数实际上是b和a的值,说明先结合了==运算符。

sete/setz 的意思:set if equal / set if zero。

sete cl 的意思:若zf为1,则cl为1,否则为0,即根据zf来设置cl的值。

sete cl 在这里的作用就是保存b == a的布尔值。

由于之前已经通过xor指令将ecx设为0,所以ecx和cl的值相等,要么为0,要么为1,也是一个布尔值。

接着,mov dword ptr [ebp-0Ch],ecx 将这个布尔结果赋给a,即a = (b == a)。

可见==的优先级大于=的优先级。

我们经常会看到 while((c = getchar()) != 'n') 这类语句。其中把c=getchar()括起来,是因为=的优先级比==和!=的优先级低(==和!=处于同一个优先级),要保证先完成赋值再进行比较。

否则,表达式就变成了c = (getchar() != 'n')。

转载于:https://www.cnblogs.com/rdt2017/p/7063345.html

相关知识

freertos中的configASSERT( ucCurrentPriority >= ucMaxSysCallPriority );
一种针对花园灌溉系统的自动化测试方法
如何修改hexo中主题的css
c语言中%运算符的运算对象,C语言中运算对象必须是整型的运算符是()。A.%=B./C.=D.......
单片机设计基于STM32的盆栽培育系统
客户的订单多如何管理
如何在 FlowUs、Notion 等笔记软件中使用矩阵分析法建立你的思维脚手架
如何搞好水资源管理项目
第三章 处理机调度与死锁(1)
本来就没什么钱,还不算着花怎么行:个人记账中的预算规划

网址: = 和 == 的优先级 https://www.huajiangbk.com/newsview746322.html

所属分类:花卉
上一篇: java多条件判断
下一篇: 决策树完成鸢尾花分类

推荐分享