一个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

 

posted @ 2015-09-15 17:46  Dalink  阅读(101)  评论(0编辑  收藏  举报