未来中森网站建设咨询,宣传型企业网站设计方案,珠海教育局系统网站,做推广网站多少钱看这个题之前#xff0c;先来回忆一下strlen函数的工作机制#xff1a; strlen所作的仅仅是一个计数器的工作#xff0c;它从内存的某个位置#xff08;可以是字符串开头#xff0c;中间某个位置#xff0c;甚至是某个不确定的内存区域#xff09;开始扫描#xff0c;…看这个题之前先来回忆一下strlen函数的工作机制 strlen所作的仅仅是一个计数器的工作它从内存的某个位置可以是字符串开头中间某个位置甚至是某个不确定的内存区域开始扫描每碰到一个非’\0’的字符计数器的值加1直到碰到第一个字符串结束符’\0’为止然后返回计数器值(长度不包含’\0’)。
#include stdio.hint main()
{char a[1000];int i;for(i0; i1000; i){a[i] -1-i;}printf(%d,strlen(a));return 0;
}
第一眼看到题目是不是觉得太简单了一点有一种把1000脱口而出的欲望这么简单我会出给你想太多了吧 且不说这儿数组的类型是char就算它的类型是int程序就会输出1000想想上面对strlen的定义是怎么说的遇到’\0’才结束统计你能保证数组后面的空间第一个字符就存储的是’\0’吗不能吧因此不要轻易给出答案。
运行后输出的答案是这样的是不是有点讶异整个人突然懵了大大的问号突然充斥着你。 分析一下这个题其实无非也就以下几个考点 1、负数在内存中的存储方式 2、char型数据占空间大小 3、0其实就是’\0’ 4、strlen函数什么时候结束统计
负数在内存中是以其补码存储的那么问题又来了什么是补码正数的补码是其原码负数的补码是其原码取反加1连原码都不知道的可以去看看补补了。 因为a[i] -1 - i; 而-1 - i的值一定是负数本来也没什么但你要知道我们的数组元素是char型的那么它就只占一个字节即8个bit所以当-1 - i的值小到-129时a[i]里面存的值就不是我们想象的值了而当 -1 - i的值小到-256时a[i]里面存的值会吓你一跳。看看下面这张图 可以看见当i 255时a[i] 0而我们知道0其实就是’\0’因为’\0’的ASCII是0而strlen函数是遇到’\0’停止统计的且不统计’\0’也就是说它只统计a[255]前面的元素个数而我们知道数组下标是从0开始的所以a[255]前面的元素个数为255个那么输出为255就很好解释了。
这个题仔细分析其实很简单但是一不小心就上当了因此我们在看待问题是一定要考虑全面不要轻易下结论。