题目
int main()
{
int i;
char a[1000];
for(i = 0; i < 256; i++)
a[i] = i + 1;
printf("len = %d\n",strlen(a));
printf("size = %d\n",sizeof(a));
return 0;
}
输出结果:___ ___。
这题目咋一看没啥难度,答案是1000,1000!!!是,sizeof(a)为1000这应该是没什么争议,但如果你认为strlen(a)也是1000的话,那么你可能对strlen函数及C语言类型转换认识还不深刻,正确答案应该是255,为什么呢?下面我们进行分析。
代码分析
我们知道,在大多数编译器中,C语言的char类型占一个字节(Byte),取值范围是-128~127,而int类型则占4个字节。
从上面的代码我们可以看到定义的数组a是char型,i是int型,那么a[i] = i + 1就包含了将每次i+1的结果(int型)转换为char型,再存入数组。
因为char型的取值范围为-128~127,int型的范围要比char型大得多,所以a[0]到a[126]存放的即是1-127,到a[127]时,已经超出了char型能取值的范围,根据类型转换原理(数据占用字节扩充或者截断),我们可以知道a[127]是-128,验证一下:
int main()
{
int i;
char a[1000];
for(i=0;i<256;i++)
a[i] = i+1;
printf("%d\n",strlen(a));
printf("%d\n",a[126]);
printf("%d\n",a[127]);
printf("%d\n",a[128]);
printf("%d\n",a[255]);
return 0;
}
运行上述代码,结果如下所示:
我们可以看到,确实a[127]为-128,而a[128]为-127,那么据此我们很清晰就可以知道,到a[255]时,其值应该为0。此时再根据strlen函数的原理:碰到数值0返回计数值(不包含0),所以答案255是怎么来的,分析到这里,相信大家应该都清楚了。