= 和 == 的优先级
有如下代码:
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')。