0

ここで、SIMPLE_EX2 は 0x0040 と OR され、これ全体が SIMPLE_EX1 へのアドレスとして提供されます。私の理解は正しいですか?

#define SIMPLE_EX1  (0x0040 | SIMPLE_EX2) 
4

4 に答える 4

4

|は C のパイプ記号ではありません。ビット単位の or です。したがって、この表現:

0x0040 | SIMPLE_EX2

の値を取得し、SIMPLE_EX27番目のビット (右から) を 1 に設定するだけです。


可能性SIMPLE_EX2は低いですが、それ自体が よりも優先順位の低い演算子を含む式である場合、式|全体が間違って解釈される可能性があることに注意してください。たとえば、 if SIMPLE_EX2isの場合a?b:c、上で書いたものとは異なります。SIMPLE_EX1(0x0040|a)?b:c

于 2012-09-05T09:14:35.783 に答える
2

優れた C プログラミングの本 (C を学んでいる場合)、または C++ を学んでいる場合は優れた C++ プログラミングの本を読む必要があります。

-d が定数整数、または括弧内の定数整数式であるSIMPLE_EX2と仮定すると、その整数は16 進数の定数 (つまり、10 進数で 64、2 進数で 0b1000000) でビットまたは演算されます。#defineSIMPLE_EX10x0040

于 2012-09-05T09:14:46.417 に答える
2

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);
于 2012-09-05T09:15:28.943 に答える
1

右から7番目のビットを設定してSIMPLE_EX2に割り当てるだけですSIMPLE_EX1

于 2012-09-05T09:56:59.657 に答える