一个C语言小技巧
软件开发中,经常会在局部建立小的数组和键值对装载局部数据,用以优化数据处理流程。一般键值对处理首先会想到语言自带的容器类,比如作为iOS开发者,首先会想到NSDictionary,作为Java开发者,首先想到HashMap。这些高级语言的容器类虽然使用简单,但是运行效率不高。如何构建快速的键值映射对象呢?最近看开源代码中,看见有大神出现了一个如下的神奇写法。分分钟有种键值映射的即视感。
1 enum Type { 2 Mon, 3 Tue 4 }; 5 float list[] = { 6 [Mon] = 10, 7 [Tue] = 20 8 };
第六行,list还可以使用下标,例如 printf("list[1]---->%f\n", list[Mon]); ,真是方便。
其实这里根本不存在键值映射。list只是一个数组,=后面的花括号只是对一部分数值初始化。花括号内部,[Mon]意思就是说,对Mon(枚举本质是数字)下标的数字赋值。数组的长度取决于最大下标。所以,很容易得出结论。首先、下标对象必须是数字,无法是对象,其次枚举值已经确定,程序员很难控制数组的长度。比如枚举值有个是MAX_FLOAT,那list的长度可不小。
这种写法局限性依然很大。
1 int main() { 2 float list[] = { 3 [1] = 10, 4 [2] = 20, 5 [65535] = 100 6 }; 7 8 printf("length %lu\n", sizeof(list)); 9 printf("list[0]---->%f\n", list[0]); 10 printf("list[1]---->%f\n", list[1]); 11 return 0; 12 }
输出:
//数组长度太长 length 262144 list[0]---->0.000000 list[1]---->10.000000