= 和 == 的优先级

有如下代码:

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')。

posted on 2017-06-22 09:47  .rdt  阅读(1218)  评论(0编辑  收藏  举报

导航