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

comparing strings inside conditional without declaring them as strings

本文关键字:字符串 声明 条件 比较      更新时间:2023-10-16

以下条件显然是假的

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

但无论任何顺序如何,以下证明都是正确的:

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

为什么它的行为是这样的?我不明白以上两个条件怎么可能都是真的。

它是

比较的指针的值。所以这取决于编译器。

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

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

当你写的时候

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

字符串文字只是"C-string",即指向字符的指针。由于它们是指针,因此您可以在它们上使用一些算术运算符,但是如果您在不同的机器上运行程序,或者只是多次运行,您可能会得到不同的答案。

如果你想比较两个std::string,你可以使用类似的东西:

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

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