2

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;
}

http://ideone.com/B33YB

4

1 に答える 1

14

演算子の優先順位のため。

+より前に実行され>>ます。

あなたが変わるとき

(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を参照してください

于 2012-06-21T13:31:31.730 に答える