一段看起来很简单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类型的,结果就变成了:测试
。。。。。。。。。。这是咱们想要的结果,那就是说宏定义没问题。spa
咱们在原来的main()函数中加一句blog
int array_length = TOTAL_ELEMENTS;
这样和类型强转的效果应该是同样的,跟踪监视后获得下面的结果:get
提示是没有找到符号"TOTAL_ELEMENTS",可是array_length却有值。。。。。。。很郁闷it
接着,咱们在for循环里处理数组长度io
for(d = -1; d <= ((sizeof(array) / sizeof(array[0])) - 2); d++)
如今,输出结果应该就是咱们想要的那个数组了。可结果呢,啥都没输出。。。。。。。更郁闷for循环
那就继续跟踪监视
好像都没问题,不过注意它们的类型,是无符号整形(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",仍是没有找到缘由,有知道的大神不妨指点一二。。。。。。