有人可以解释在C ++中对字符串使用<或>时发生了什么吗?

时间:2019-01-14 02:43:16

标签: c++

在阅读一本C ++书时,我遇到了一个使用>比较两个字符串的示例。我试用了该代码,发现这两个语句对同一事物的求值不同。有人可以解释在C ++中对字符串使用<或>时发生了什么吗?

string s = "fool"; 
cout << ("fool" < "ape"); // returns true (1)
cout << (s < "ape"); //returns false (0)

3 个答案:

答案 0 :(得分:8)

"fool""ape"是字符串文字,它们的类型是内置类型(实际上是const char的数组),因此您得到了{{1 }}。具体来说,您将得到数组到指针的衰减,然后进行指针比较。

禁止在不同数组中的项目之间进行指针比较,因此比较结果不确定(甚至可能无法重复)。

另一个比较operator<非常不同。其中一个操作数具有类类型,因此使用s < "ape"提供的重载运算符。该重载实际上知道字符串比较。

答案 1 :(得分:2)

cout << (s < "ape"); //returns false (0)

这意味着您已经(明示或暗示地)转换string,然后就可以安全地进行比较了。

cout << ("fool" < "ape"); // returns true (1)

这意味着您正在比较两个指针,因为它们是字符串文字。请在C++ Comparison of String Literals上查看有关此内容的更多信息。

答案 2 :(得分:1)

  

cout <<(“傻瓜” <“猿”); //返回true(1)

它比较指针地址,但不确定哪个更大。如果您编写另一个程序,则结果可能为假(0)。此类代码应该从不出现在您的程序中。 (感谢Ben Voigt,请参阅他的回答)

  

cout <<(s <“ ape”); //返回假(0)

它使用C ++的<重载运算符,逐字节比较字符串。