为什么两个printf语句输出不同的值?
int main()
{
int n=10;
printf("%d\n",(n&0xAAAAAAAA)>>1 + n&0x55555555 ); //prints 0
printf("%d\n", n&0x55555555 + (n&0xAAAAAAAA)>>1 ); //prints 10
return 0;
}
为什么两个printf语句输出不同的值?
int main()
{
int n=10;
printf("%d\n",(n&0xAAAAAAAA)>>1 + n&0x55555555 ); //prints 0
printf("%d\n", n&0x55555555 + (n&0xAAAAAAAA)>>1 ); //prints 10
return 0;
}
因为运算符优先级。
+
早于 执行>>
。
当你改变
(n&0xAAAAAAAA)>>1 + n&0x55555555)
到
n&0x55555555 + (n&0xAAAAAAAA)>>1)
您实际上是在更改执行操作的顺序。
(n&0xAAAAAAAA)>>1 + n&0x55555555
可以重写为(n&0xAAAAAAAA)>>(1 + n&0x55555555)
与((n&0xAAAAAAAA)>>1) + n&0x55555555
(第二行的状态)不同
+
和运算符也是如此&
。
因此,要使输出它们的输出相似,您需要额外的括号:
int main()
{
int n=10;
printf("%d\n",((n&0xAAAAAAAA)>>1) + (n&0x55555555) ); // prints 5
printf("%d\n",(n&0x55555555) + ((n&0xAAAAAAAA)>>1) ); // prints 5
return 0;
}