不理解C语言自定义strlen函数运行逻辑,求代码逐行解释
问题1:为什么要定义局部变量eos?
- 传入的参数
str存储的是待计算长度的字符串的起始地址,这个值是后续计算长度的基准值。如果直接修改str指针来遍历字符串,后续就无法获取字符串的原始起始位置。定义eos作为临时遍历指针,既可以完成遍历移动,也能保留原始起始地址str用于后续差值计算。
问题2:为什么while循环是空语句?
- 这段代码中while的判断条件本身已经完成了所有遍历需要的操作:
- 先取当前
eos指向的字符,判断是否为字符串结束标记'\0'(C语言中'\0'的数值为0,对应布尔值为假) - 无论判断结果是否为真,后置
++都会执行,eos指针会向后移动一个char长度的地址
- 先取当前
- 遍历逻辑已经完全在条件判断里实现,不需要额外的循环体逻辑,因此用单独的分号作为空循环体即可,等价于
while (*eos++) {},写法更简洁。
问题3:返回表达式eos - str - 1的含义是什么?
- C语言中两个同类型的指针相减,得到的是两个地址之间相差的对应类型元素的个数,这里都是
char*类型,差值就是两个地址之间相差的char字符数量。 - 循环结束时的指针位置:当
eos指向字符串结束符'\0'时,*eos的结果为0,循环条件不成立,但是后置++依然会执行,此时eos会移动到'\0'后面的第一个地址。 - 此时
eos - str得到的是从字符串起始位置到'\0'后一位的总偏移量,比实际字符串长度多了1(多算了最后一次额外的自增步长),所以减1之后就得到了不含结束符的实际字符串长度。
内容的提问来源于stack exchange,提问作者RedZ
相关产品推荐
相关产品推荐

