Здесь SIMPLE_EX2 ORed с 0x0040, и все это обеспечивает в качестве адреса SIMPLE_EX1. Правильно ли мое понимание?
#define SIMPLE_EX1 (0x0040 | SIMPLE_EX2)
|
это не знак трубы в C. Это немного или. Итак, это выражение:
0x0040 | SIMPLE_EX2
Просто получает значение SIMPLE_EX2
и устанавливает это 7го бит (справа) до 1.
Вряд ли, но учтите, что если SIMPLE_EX2
само по себе является выражением с оператором, который имеет более низкий приоритет, чем |
Общее выражение может быть неверно истолковано. Например, если SIMPLE_EX2
является a?b:c
, затем SIMPLE_EX1
становится (0x0040|a)?b:c
это не то, что я написал выше.
Вы должны прочитать хорошую книгу по программированию на C (если вы изучаете C) или хорошую книгу по программированию на C ++, если вы изучаете C ++.
Если предположить, SIMPLE_EX2
является #define
-d как постоянное целое число или выражение с постоянным целым в скобках, то SIMPLE_EX1
это целое число бит или с ред 0x0040
шестнадцатеричная константа (то есть 64 в десятичном виде или 0b1000000 в двоичном).
SIMPLE_EX2 ORed с 0x0040
да.
и все это в качестве адреса к SIMPLE_EX1.
нет.
Директива препроцессора #define — это в основном текстовая операция поиска и замены, которая выполняется перед компиляцией. Не больше и не меньше. Поэтому всякий раз, когда вы пишете SIMPLE_EX1
в вашем коде он заменяется на текст (0x0040 | SIMPLE_EX2)
до компиляции.
Интересный фрагмент кода, который иллюстрирует это:
#define SIX 1+5
#define NINE 8+1
printf("Six times nine is %d.", SIX * NINE);
Этот код вернет 42, а не 54, как можно было бы ожидать, потому что препроцессор превращает всю программу в:
printf("Six times nine is %d.", 1 + 5 * 8 + 1);
Это просто установка 7-го бита справа для SIMPLE_EX2
и назначив его SIMPLE_EX1