C++中std::string::compare()与字符串运算符的行为不一致问题
你观察到的这个差异完全是C++标准明确定义的行为,绝非编译器实现的bug,核心原因在于这两种比较操作的本质天差地别:
直接比较字符串字面量:比的是指针地址,不是内容
当你写"100">"035"时,这两个字符串字面量的类型是const char*——说白了就是指向字符数组的指针。此时用>或<比较的是这两个指针的内存地址大小,和字符串内容半毛钱关系都没有!编译器会把字符串字面量存在程序的只读数据段里,具体的存储顺序由编译器说了算。在你的测试环境里,"100"的内存地址比"035"小,所以"100"<"035"返回true(输出1),"100">"035"返回false(输出0)。这种比较完全不符合我们对“字符串比较”的预期。std::string::compare()(或std::string的关系运算符):比的是字符串内容
std::string的compare()方法,以及它重载的>/<运算符,都是按**逐字符的字典序(基于字符编码值,通常是ASCII)**来比较内容的:
第一个字符'1'的ASCII值是49,'0'是48,49比48大,所以"100"的内容肯定大于"035",compare()返回1(表示当前字符串大于参数),这才是符合直觉的逻辑。
补充一句:如果要正确比较C风格字符串的内容,别用关系运算符,要用C标准库的strcmp()函数,比如strcmp("100", "035"),它的返回规则和std::string::compare()一致:正数表示前者大,负数表示前者小,0表示相等。
内容的提问来源于stack exchange,提问作者Keerthana S

