В C что определяет этот макрос? - PullRequest
1 голос
/ 24 мая 2011
#define NUM_SQ_0 (1 << 1*1)  //<<----- ??

static struct square sq_0[NUM_SQ_0];

Обратите внимание, что квадрат - это структура с 4 указателями на квадрат, определяемая следующим образом:

typedef struct square {
    struct square *nw, *ne,
                  *sw, *se;
} *square;

Ответы [ 6 ]

7 голосов
/ 24 мая 2011

Он оценивается как 1 сдвинутый 1 бит влево, то есть число, также известное как 2.

Поскольку оператор умножения * связывается сильнее, чем оператор сдвига битов <<, выражениеанализируется как 1 << (1 * 1), то есть просто 1 << 1.

. В двоичном коде, используя 8 битов для удобства чтения, мы имеем

  00000001
<<       1        
==========
  00000010

. При преобразовании обратно в десятичное число мы получаем 00000010 2 = 2 10 .

2 голосов
/ 24 мая 2011

1 << 1*1 просто оценивается как 2
Из названия макроса и структуры позже можно представить, что существует несколько массивов разных размеров, которые рассчитываются как последовательность сдвигов битов на кратное число ... например есть NUM_SQ_1 (1 << 2*2) ... но это только догадка ...

1 голос
/ 24 мая 2011

В соответствии с приоритетом оператора C ++, сначала вычисляется оператор *, который оценивается в значение 1, а затем сдвигается на один бит влево, что является значением 2^1 или просто 2.

0 голосов
/ 24 мая 2011

Кажется странным окольным путем сказать:

#define NUM_SQ_0 2

Возможно, целью было в конечном итоге заменить один (или оба) члена в 1 * 1 другим макросом в качестве своего рода параметра времени компиляции, но никогда не был задокументирован и в конечном итоге забыт. К сожалению, подобные вещи случаются слишком часто.

0 голосов
/ 24 мая 2011

1 << 1*1 сдвиги 0x01 влево на 1 бит, что соответствует 0x02. Таким образом, NUM_SQ_0 равно 2, а sq_0 - это массив из двух square структур.

например. это так же, как static struct square sq_0[2];

0 голосов
/ 24 мая 2011

Один, сдвинут влево на один бит. Это приведет к двум. Я не могу представить обоснование этого макроса.

...