C语言中使用>、<、=运算符比较字符串的规则咨询
C语言中
s1 > s2比较操作的规则 核心前提澄清
你测试出现结果不一致的根本原因是:直接用>、<等运算符操作char*类型的s1、s2时,比较的是指针本身的内存地址,完全不涉及指针指向的字符串内容。
你之前听说的「对比首个字符」的规则,是字符串比较标准库函数的逻辑,和直接比较指针的操作无关。
直接比较指针的判定规则
C语言本身没有内置的字符串运算逻辑,所有对指针类型变量执行的比较运算,规则统一如下:
- 实际比较的是两个指针存储的虚拟内存地址的数值大小
- 条件成立时返回整数
1,不成立时返回整数0
举个例子:如果s1对应的内存地址是0x7ffd8f2a1020,s2对应的内存地址是0x7ffd8f2a1010,那么s1 > s2的结果就是1,和这两个地址指向的字符内容没有任何关系。
正确的字符串内容比较方式
如果要对比两个字符串的字典序大小,必须使用string.h头文件下的strcmp函数,函数调用形式为strcmp(s1, s2),判定规则如下:
- 返回值小于0:s1的字典序小于s2
- 返回值等于0:s1和s2的内容完全一致
- 返回值大于0:s1的字典序大于s2
strcmp的执行逻辑就是逐位对比字符的ASCII码:先对比两个字符串的第0位字符,若ASCII值不同则直接返回二者的差值,若相同则继续对比下一位,直到出现不同字符或遇到字符串结束符\0为止。
复现你遇到的不一致场景
你遇到的s1 > s2和s1[0] > s2[0]结果不一致的情况,本质就是指针地址的大小关系和首字符ASCII的大小关系没有必然关联,以下是示例代码:
#include <stdio.h> #include <string.h> int main() { // 栈上变量的分配顺序由编译器决定,此处str3地址比str4更低 char str3[] = "banana"; char str4[] = "apple"; printf("str3 > str4 结果:%d\n", str3 > str4); // 比较地址,结果为0 printf("str3[0] > str4[0] 结果:%d\n", str3[0] > str4[0]); // 'b' > 'a',结果为1 printf("strcmp(str3, str4) > 0 结果:%d\n", strcmp(str3, str4) > 0); // 字符串内容比较,结果为1 return 0; }
内容的提问来源于stack exchange,提问作者Ele975
相关产品推荐
相关产品推荐

