大家首先来看下面这么一段代码。
#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;
}
可能你的第一反应当然是输出数组array的所有成员了。但是当你运行一下,你发现,并不是你想象的那样。它一个元素都没有输出!
稍加分析一下也许你找到问题所在了,也许你没有找到。下面,简要说一下这里的问题所在。
宏定义中的TOTAL_ELEMENTS的作用是利用sizeof()函数获取array成员的数目,当然是7个,可能你仍在困惑为什么没有执行for循环。其实原因在这里,sizeof()函数的返回值是unsigned无符号类型。变量d声明为int类型。所以当d=-1的时候,虽然在你看来d小于数组元素个数7,但是在计算机看来并不是这样的,当两者比较时,由于类型不同,所以会转换类型,这时int类型的变量d转换为了unsigned ,自动转换规则 char ,short→int→unsigned→long→double←float。由于d的初始值为-1,所以原本在最高位上有符号位1,因此在转换为无符号型时,其最高位还是1,因此d的值变得非常大,所以在这里d>(TOTAL_ELEMENTS-2)。
地址:http://www.friendsmoment.com/?post=2