プログラムの最後に宣言された main がここでどのように機能し、'\' がどのように使用されるか教えてください。出力 s 0
#define P printf("%d\n", -1^~0);
#define M(P) int main()\
{\
P\
return 0;\
}
M(P)
プログラムの最後に宣言された main がここでどのように機能し、'\' がどのように使用されるか教えてください。出力 s 0
#define P printf("%d\n", -1^~0);
#define M(P) int main()\
{\
P\
return 0;\
}
M(P)
マクロ展開後、これは次と同等です。
int main() { printf("%d\n", -1^~0); return 0; }
次に、~0
は-1
2 の補数系にあるため -1 ^ ~0
、数値をそれ自体で xor すると となり-1 ^ -1
ます。0
0
オプションを使用してコンパイル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
) を出力します。
プリプロセッサによって、コードは次のように展開されます。
int main()
{
printf("%d\n", -1^~0);
return 0;
}
~0
0
このすべてのビットは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 の仕組みを確認してください。
使用する:
gcc -E <file_name>.c
-E 前処理のみ。コンパイル、アセンブル、またはリンクしないでください
出力:
int main() { printf("%d\n", -1^~0); return 0; }