#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;
答案 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中的一个(或两个)术语替换为另一个宏作为一种编译时参数,但从未记录并最终被遗忘。不幸的是,这种事情经常发生。