C语言实现strcmp函数时while(*X)循环的判断逻辑是什么?
C语言
while(*X)循环判断逻辑说明 C语言的条件判断遵循统一的隐式转换规则:所有放在判断位置的表达式,零值判定为假,非零值判定为真,不需要显式写比较运算符。
while(*X)的等价逻辑
这个写法是C语言操作字符串时的惯用简写,完全等价于while(*X != '\0'):
- 字符指针
X解引用得到的*X是char类型,本质是1字节长度的整数,存储字符对应的ASCII编码值 - C语言标准规定字符串必须以ASCII值为
0的空字符'\0'作为结束标记,当指针遍历到字符串末尾时,解引用拿到的值就是0,会被判定为假,终止循环 - 其余所有普通字符的ASCII编码值都在1~255区间,属于非零值,会被判定为真,继续执行循环体
对应strcmp实现的循环流程
你贴出的自定义strcmp代码中,这个循环有两种退出场景:
- 自然退出:指针
X遍历到第一个字符串的末尾'\0'位置,*X为0触发循环条件为假,退出循环 - 主动跳出:循环执行过程中判断到当前位置的两个字符
*X和*Y不相等,执行break直接终止循环
循环结束后直接返回两个指针当前位置字符转unsigned char后的差值,刚好符合strcmp的返回值规则:
- 差值为0说明两个字符串完全相等(此时X、Y都指向各自字符串的结束符
'\0',差值为0-0=0) - 差值为正说明X指向的字符串更大
- 差值为负说明X指向的字符串更小(包含X比Y短、提前遍历到结束符的场景)
完整参考实现代码如下:
#include <stdio.h> // 自定义实现strcmp函数 int strcmp(const char *X, const char *Y) { while (*X) { // 字符不相等、或第二个字符串提前到达末尾时跳出循环 if (*X != *Y) { break; } // 指针后移,对比下一对字符 X++; Y++; } // 转换为unsigned char后返回ASCII差值,避免有符号char溢出导致结果错误 return *(const unsigned char*)X - *(const unsigned char*)Y; } int main() { char *X = "Techie"; char *Y = "Tech"; int ret = strcmp(X, Y); if (ret > 0) { printf("X is greater than Y"); } else if (ret < 0) { printf("X is less than Y"); } else { printf("X is equal to Y"); } return 0; }
以示例中传入的"Techie"和"Tech"为例:循环前4轮两个字符串的字符T/e/c/h全部相等,指针同步后移;第5轮判断时X指向字符'i'(ASCII值105),Y已经遍历到结束符'\0'(值为0),两者不相等触发break,返回105-0=105>0,最终输出X大于Y,符合预期。
内容的提问来源于stack exchange,提问作者Steve Bob
相关产品推荐
相关产品推荐

