一段看起来很简单C代码,预期结果是输出array数组。
- #include<stdio.h>
- #define TOTAL_ELEMENTS (sizeof(array) / sizeof(array[0]))
- int array[] = {23,34,12,17,204,99,16};
- int main()
- {
- int d;
- for(d = -1;d <= (TOTAL_ELEMENTS - 2); d++)
- printf("%d\n", array[d+1]);
- return 0;
- }
代码编译运行后,结果不是想要的那个数组,而是空值,这是很多人就会想到宏定义了,原因是宏定义是没办法获得数组的长度。
可我们把for循环改一下就有不同的结果了
- for(d = -1; d <= ((int)TOTAL_ELEMENTS-2); d++)
把TOTAL_ELEMENTS强制转换成int类型的,结果就变成了:
。。。。。。。。。。这是我们想要的结果,那就是说宏定义没问题。
我们在原来的main()函数中加一句
- int array_length = TOTAL_ELEMENTS;
这样和类型强转的效果应该是一样的,跟踪监视后得到下面的结果:
提示是没有找到符号"TOTAL_ELEMENTS",但是array_length却有值。。。。。。。很郁闷
接着,我们在for循环里处理数组长度
- for(d = -1; d <= ((sizeof(array) / sizeof(array[0])) - 2); d++)
现在,输出结果应该就是我们想要的那个数组了。可结果呢,啥都没输出。。。。。。。更郁闷
那就继续跟踪监视
好像都没问题,不过注意它们的类型,是无符号整形(unsigned int),而循环条件d是整形(int),并且d的初始值为-1,不再无符号整形(unsigned int)定义范围之内,现在看来好像是类型的问题了,那我们将循环条件d的初始值改为0试试:
- #include<stdio.h>
- #define TOTAL_ELEMENTS (sizeof(array) / sizeof(array[0]))
- int array[] = {23,34,12,17,204,99,16};
- int main()
- {
- int d;
- for(d = 0; d <= (TOTAL_ELEMENTS - 1); d++)
- printf("%d\n", array[d]);
- return 0;
- }
输出的结果是
结果正是我们想要的。没有进行强制类型转换,也没有进行二次赋值,只是将循环条件d的初始值定义在了无符号整形(unsigned int)的范围之内。
我们再做个小测试
- int main()
- {
- int array[] = {23,34,12,17,204,99,16};
- int d = -1;
- if(d <= (sizeof(array) / sizeof(array[0])) -2)
- printf("先有鸡\n");
- else
- printf("先有蛋\n");
- return 0;
- }
从代码看来,应该是输出“先有鸡”。不过这次结果又是事与愿违,输出的是“先有蛋”。
所以建议在写代码的时候尽量避免使用无符号类型,同时也尽量避免有符号类型和相应的无符号类型进行比较等。
================================================================
本人才疏学浅和其他原因,没有进行更深入的研究,只是偶尔看到的IT面试题,感兴趣简单的测了一下。
不过跟踪监视后,CX0017:错误:没有找到符号"TOTAL_ELEMENTS",还是没有找到原因,有知道的大神不妨指点一二。。。。。。