ここで、SIMPLE_EX2 は 0x0040 と OR され、これ全体が SIMPLE_EX1 へのアドレスとして提供されます。私の理解は正しいですか?
#define SIMPLE_EX1 (0x0040 | SIMPLE_EX2)
ここで、SIMPLE_EX2 は 0x0040 と OR され、これ全体が SIMPLE_EX1 へのアドレスとして提供されます。私の理解は正しいですか?
#define SIMPLE_EX1 (0x0040 | SIMPLE_EX2)
|
は C のパイプ記号ではありません。ビット単位の or です。したがって、この表現:
0x0040 | SIMPLE_EX2
の値を取得し、SIMPLE_EX2
7番目のビット (右から) を 1 に設定するだけです。
可能性SIMPLE_EX2
は低いですが、それ自体が よりも優先順位の低い演算子を含む式である場合、式|
全体が間違って解釈される可能性があることに注意してください。たとえば、 if SIMPLE_EX2
isの場合a?b:c
、上で書いたものとは異なります。SIMPLE_EX1
(0x0040|a)?b:c
優れた C プログラミングの本 (C を学んでいる場合)、または C++ を学んでいる場合は優れた C++ プログラミングの本を読む必要があります。
-d が定数整数、または括弧内の定数整数式であるSIMPLE_EX2
と仮定すると、その整数は16 進数の定数 (つまり、10 進数で 64、2 進数で 0b1000000) でビットまたは演算されます。#define
SIMPLE_EX1
0x0040
SIMPLE_EX2 は 0x0040 と ORed されています
はい。
SIMPLE_EX1 へのアドレスとして提供するこの全体。
番号。
#define プリプロセッサ ディレクティブは、基本的に、コンパイル前に実行される検索と置換のテキスト操作です。それ以上のことは何もありません。したがって、コードを記述するたびに、コンパイル前にSIMPLE_EX1
テキストで置き換えられます。(0x0040 | SIMPLE_EX2)
これを示す興味深いコード スニペット:
#define SIX 1+5
#define NINE 8+1
printf("Six times nine is %d.", SIX * NINE);
このコードは、プリプロセッサがプログラム全体を次のように変換するため、予想される 54 ではなく 42 を返します。
printf("Six times nine is %d.", 1 + 5 * 8 + 1);
右から7番目のビットを設定してSIMPLE_EX2
に割り当てるだけですSIMPLE_EX1