一段看起来很简单的C代码,预期结果是输出一个array数组。#include#defineTOTAL_ELEMENTS(sizeof(array)/sizeof(array[0]))intarray[]={23,34,12,17,204,99,16};intmain(){intd;for(d=-1;d<=(TOTAL_ELEMENTS-2);d++)printf("%d\n",array[d+1]);返回0;}代码编译运行后,得到的不是想要的数组,而是Null值,这也是很多人想到宏定义的原因,因为宏定义没有办法得到数组的长度。但是如果我们改变for循环,就会有不同的结果。for(d=-1;d<=((int)TOTAL_ELEMENTS-2);d++)将TOTAL_ELEMENTS转换为int类型,结果变为:。.........这就是我们想要的结果,也就是说宏定义没问题。我们在原来的main()函数中加入一句intarray_length=TOTAL_ELEMENTS;这应该与类型强制具有相同的效果。经过跟踪监控,我们得到如下结果:提示是没有找到符号“TOTAL_ELEMENTS”,但是array_length是有值的。......很郁闷接下来我们在for循环中处理数组长度for(d=-1;d<=((sizeof(array)/sizeof(array[0]))-2);d++)现在,输出应该是我们想要的数组。但是结果什么都没有输出。......更郁闷的是,继续跟踪监控似乎没有问题,但是要注意它们的类型,都是无符号整数(unsignedint),循环条件d是整数(int),而初始值d为-1,不再是无符号整数(unsignedint)在定义范围内,现在看来是类型问题,那我们试试把循环条件d的初值改成0:#include#defineTOTAL_ELEMENTS(sizeof(array)/sizeof(array[0]))intarray[]={23,34,12,17,204,99,16};intmain(){intd;for(d=0;d<=(TOTAL_ELEMENTS-1);d++)printf("%d\n",array[d]);返回0;输出的结果正是我们想要的。没有强制类型转换或二次赋值,而是将循环条件d的初值定义在无符号整数(unsignedint)范围内。让我们再做一个小测试intmain(){intarray[]={23,34,12,17,204,99,16};intd=-1;if(d<=(sizeof(array)/sizeof(array[0]))-2)printf("先吃鸡\n");elseprintf("先打蛋\n");返回0;}从代码来看,它应该输出“Chickenfirst”。但这一次结果又适得其反,输出结果是“先有鸡蛋”。因此,建议在编写代码时尽量避免使用无符号类型,也尽量避免将有符号类型与对应的无符号类型进行比较。=========================================================================================================================================================================================================。但是经过跟踪监控,CX0017:Error:Thesymbol"TOTAL_ELEMENTS"wasnotfound,仍然没有找到原因。有知道的不妨指点一下。.....原文链接:http://www.cnblogs.com/lonzhe/p/3914975.html