在C中这个宏定义了什么?

时间:2011-05-24 12:53:02

标签: c macros c-preprocessor bit-shift

#define NUM_SQ_0 (1 << 1*1)  //<<----- ??

static struct square sq_0[NUM_SQ_0];

请注意,square是一个带有4个指向square的指针的结构,定义如下:

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

6 个答案:

答案 0 :(得分:7)

它评估为左移1位,即数字也称为2。

由于乘法运算符*比位移运算符<<更紧密,因此表达式被解析为1 << (1 * 1),即只有1 << 1

在二进制中,使用8位可读性,我们有

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

转换回十进制,我们得到00000010 2 = 2 10

答案 1 :(得分:2)

1 << 1*1只评估为2
从宏的名称和稍后的结构,可以想象存在多个不同大小的阵列,其被计算为由一系列数字的一系列位移...例如,有一个NUM_SQ_1 (1 << 2*2) ......但这只是猜测...

答案 2 :(得分:1)

每个C ++运算符优先级,首先计算*运算符,并计算值1,然后向左移一位,即值2^1或只是2

答案 3 :(得分:0)

一个,向左移一位。这将导致两个。我无法想象这个宏的基本原理。

答案 4 :(得分:0)

1 << 1*1 shifts 0x01左侧1位,评估为0x02。因此NUM_SQ_0等于2,sq_0是两个square结构的数组。

E.g。它与static struct square sq_0[2];

相同

答案 5 :(得分:0)

这似乎是一种奇怪的迂回方式:

#define NUM_SQ_0 2

也许意图是最终将1 * 1中的一个(或两个)术语替换为另一个宏作为一种编译时参数,但从未记录并最终被遗忘。不幸的是,这种事情经常发生。