Что здесь обозначают 0x0040 и знак трубы?

Здесь SIMPLE_EX2 ORed с 0x0040, и все это обеспечивает в качестве адреса SIMPLE_EX1. Правильно ли мое понимание?

#define SIMPLE_EX1  (0x0040 | SIMPLE_EX2)

0

Решение

| это не знак трубы в C. Это немного или. Итак, это выражение:

0x0040 | SIMPLE_EX2

Просто получает значение SIMPLE_EX2 и устанавливает это 7го бит (справа) до 1.


Вряд ли, но учтите, что если SIMPLE_EX2 само по себе является выражением с оператором, который имеет более низкий приоритет, чем |Общее выражение может быть неверно истолковано. Например, если SIMPLE_EX2 является a?b:c, затем SIMPLE_EX1 становится (0x0040|a)?b:c это не то, что я написал выше.

4

Другие решения

Вы должны прочитать хорошую книгу по программированию на C (если вы изучаете C) или хорошую книгу по программированию на C ++, если вы изучаете C ++.

Если предположить, SIMPLE_EX2 является #define-d как постоянное целое число или выражение с постоянным целым в скобках, то SIMPLE_EX1это целое число бит или с ред 0x0040 шестнадцатеричная константа (то есть 64 в десятичном виде или 0b1000000 в двоичном).

2

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);
2

Это просто установка 7-го бита справа для SIMPLE_EX2 и назначив его SIMPLE_EX1

1