比较条件内的字符串而不将它们声明为字符串

时间:2014-11-15 17:52:10

标签: c++ string-comparison

以下条件显然是假的

   string e = "English", c = "Chemistry";
   if (e < c) ... // this is False

但无论任何顺序如下,以下证明均属实:

  if("English" < "Chemistry") ...//True

  if("Chemistry" < "English") ... //also True

为什么它会像这样?我不明白上述两个条件是如何成真的。

3 个答案:

答案 0 :(得分:0)

它是被比较的指针的值。所以它取决于编译器。

您需要使用strcmp或字符串的比较运算符。

答案 1 :(得分:0)

字符串文字只是“C字符串”,它是指向char的指针。由于它们是指针,你可以在它们上使用一些算术运算符,但如果你在不同的机器上运行你的程序,或者只是几次,你可能得到不同的答案。

如果你想比较两个std::string,你可以使用这些内容:

if (std::string("English") < "Chemistry")

请注意,至少在字符串上必须是std::string

答案 2 :(得分:0)

"English"的类型为const char[],它会衰减为char const *:也就是说,它实际上是指向存储初始E的内存位置的指针。 / p>

写作时

string e = "English"

您隐含地调用由类型string定义的转化构造函数,它需要char *并创建string

string e("English")

此时,e < c相当于e.operator<(c),实际上会调用string.operator<并执行字符串比较。

但是当你直接比较"English""Chemistry"时,你没有任何string个对象,所以你实际上只是比较指针 - 内存位置 - 结果是不可预知的。相反,您需要使用标准strcmp函数:

strcmp("English", "Chemistry") < 0  // false: English is not less than Chemistry