首先我们举个例子来看看num ^= val && num的值是多少?
#include<stdio.h>
int main()
{
int num = 0xa5;
int val = 0x5a;
printf("%#x\n", num ^= val && num);// 0xa4
return 0;
}
答案是0xa4,和你想的一样吗?我们将num ^= val && num拆开来看看:num = num ^ val && num,根据按位异或的优先级大于逻辑与的优先级计算,结果为0x1,和答案不一样。我们再来举个更简单的例子:
#include<stdio.h>
int main()
{
int i = 2;
i *= 3 + 2;
printf("%d\n", i);// 10
return 0;
}
答案是10,而不是8,根据这个例子我们不难看出,我们在拆开类似上面两个例子的时候,一定要将赋值符号右边的算式用括号括起来,比如num =num^ (val && num),i=i*(3+2),这样计算才不会错。