2 つの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;
}
2 つの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
(これは2行目が述べていることです)
+
と&
演算子についても同じことが言えます。
したがって、出力を同様の出力にするには、追加の括弧が必要です。
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;
}
http://ideone.com/d3mHTを参照してください