在C ++中对字符串进行操作的关系运算符未按预期工作

时间:2018-10-09 22:07:22

标签: c++

int main() 
{ 
    string s1("z"); 
    string s2("ab"); 
    if(s1 > s2) cout << s1 << " is greater than " << s2 << endl;
    cout << ("z" > "ab") << endl;
    return 0; 
 }

输出为

z is greater than ab
0

我有点困惑,因为在第三条语句s1中> s2进行了字典比较,并且期望得到结果,但是语句4返回0值。

谢谢,这让我发疯了

更新------

#include<iostream>
using namespace std;

int main() 
{ 
    string s1("z"); 
    string s2("ab"); 
    cout << &s1 << " " << &s2 << endl;
    if(s1 > s2) cout << s1 << " is greater than " << s2 << endl;
    cout << ("z" > "ab") << endl;
    cout << ("ab" > "z") << endl;
    cout << &("ab") <<  " "  << &("z") << endl;
    return 0; 
}

上面的代码帮助了我。

3 个答案:

答案 0 :(得分:3)

cout << ("z" > "ab") << endl;

等同于

char const* s1 = "z";
char const* s2 = "ab";
cout << (s1 > s2) << endl;

该表达式仅比较两个指针。不能保证结果为true。也不能保证是false。结果取决于编译器在何处为字符串文字分配内存。

答案 1 :(得分:0)

"z" > "ab"比较C字符串文字,因此它比较指针而不是内容。

从理论上讲,哪个BTW的定义不明确(std::less是)。

答案 2 :(得分:0)

问题在于,您使用的“字符串”文字不是真正的字符串:它们会退化为指向char的指针。那就是可怕的C语言遗产。 uck

如果要比较字符串,则必须明确说明它:

assert(string_view("z") > string_view("ab"has ));

Prefer也声明调试输出。它们使您清楚观察到的内容,而无需提供任何输出,也无需使用英语散文来描述您所得到的。然后,您的问题可以最小化为“为什么4中的断言成立?”。