-2

プログラムの最後に宣言された main がここでどのように機能し、'\' がどのように使用されるか教えてください。出力 s 0

#define P printf("%d\n", -1^~0);
#define M(P) int main()\
         {\
            P\
            return 0;\
         }
M(P)
4

4 に答える 4

2

マクロ展開後、これは次と同等です。

int main() { printf("%d\n", -1^~0); return 0; }

次に、~0-12 の補数系にあるため -1 ^ ~0、数値をそれ自体で xor すると となり-1 ^ -1ます。00

于 2013-07-27T09:25:20.333 に答える
2

オプションを使用してコンパイルgccおよび追加する-E(つまり、前処理後に停止し、前処理されたコードを出力する) と、何が起こっているかが明らかになります。

# 1 "output.c"
# 1 "<command-line>"
# 1 "output.c"


int main() { printf("%d\n", -1^~0); return 0; }

基本的に、整数を出力するだけです: -1^~0.

これは-1 XOR 0xFFFFFFFF(ここでは整数が 32 ビットであると仮定して) と等価であり、 の 2 の補数1(つまり、 の表現-1) はである0xFFFFFFFFため、常に0( 1 XOR 1 == 0) を出力します。

于 2013-07-27T09:26:50.037 に答える
1

プリプロセッサによって、コードは次のように展開されます。

int main()
{
  printf("%d\n", -1^~0);
  return 0;
}

~00このすべてのビットは1(ほとんどの実装では) の 1 の補数です。

  0000 0000 0000 0000 0000 0000 0000 0000 = 0
  1111 1111 1111 1111 1111 1111 1111 1111   <== ~0 , compliment each bit

したがって、32 ビットの int があるとします。

-1これも2'c の補数で1、すべてのビットが 1 です。

  0000 0000 0000 0000 0000 0000 0000 0001   <== 1
  1111 1111 1111 1111 1111 1111 1111 1110   <== 1's complement of 1 
  1111 1111 1111 1111 1111 1111 1111 1111   <== 2's complement of 1 

したがって、次のよう-1^ ~0 に出力されます。 0

in^XOR- 演算子 andであるため1 xor 1 = 0です。

~0       ==   1111 1111 1111 1111 1111 1111 1111 1111   
-1       ==   1111 1111 1111 1111 1111 1111 1111 1111
            ------------------------------------------- Bitwise XOR
~0 ^ -1  ==   0000 0000 0000 0000 0000 0000 0000 0000

ここで XOR の仕組みを確認してください。

于 2013-07-27T09:27:36.417 に答える
0

使用する:

gcc -E <file_name>.c

-E 前処理のみ。コンパイル、アセンブル、またはリンクしないでください

出力:

int main() { printf("%d\n", -1^~0); return 0; }
于 2013-07-27T09:27:16.540 に答える