C++;字符串文本的比较 我是C++新手(只是老学校C)。我儿子向我求助,我无法解释。如果他问我“如何比较字符串”,我会告诉他使用strcmp(),但这并不是让我困惑的地方。以下是他提出的问题: int main() { cout << ("A"< "Z"); } intmain() { cout

C++;字符串文本的比较 我是C++新手(只是老学校C)。我儿子向我求助,我无法解释。如果他问我“如何比较字符串”,我会告诉他使用strcmp(),但这并不是让我困惑的地方。以下是他提出的问题: int main() { cout << ("A"< "Z"); } intmain() { cout,c++,string-literals,C++,String Literals,您正在比较内存地址。显然,您的编译器将字符串文本按遇到它们的顺序放在内存中,因此第一个比第二个“小” 因为在第一个代码段中,它首先看到“A”,其次看到“Z”,所以“A”较小。因为它在第二个代码段中首先看到“Z”,所以“Z”较小。在最后一个代码段中,它已经有了文本“A”和“Z”当第二个命令运行时放置。字符串文字具有静态存储持续时间。在所有这些比较中,编译器为字符串文字分配了比较的内存地址。编译器遇到的第一个字符串文字似乎存储在内存中,与下一个字符串文字相比,其地址更低不计数的字符串文字 所以在这个

您正在比较内存地址。显然,您的编译器将字符串文本按遇到它们的顺序放在内存中,因此第一个比第二个“小”


因为在第一个代码段中,它首先看到“A”,其次看到“Z”,所以“A”较小。因为它在第二个代码段中首先看到“Z”,所以“Z”较小。在最后一个代码段中,它已经有了文本“A”和“Z”当第二个命令运行时放置。

字符串文字具有静态存储持续时间。在所有这些比较中,编译器为字符串文字分配了比较的内存地址。编译器遇到的第一个字符串文字似乎存储在内存中,与下一个字符串文字相比,其地址更低不计数的字符串文字

所以在这个节目里,

int main() 
{ 
  cout << ("Z"< "A");
  cout << ("A"< "Z");
}
intmain()
{ 

如果你想比较实际的C++字符串,你需要声明C++字符串:

int main() 
{
  const std::string a("A");
  const std::string z("Z");

  cout << (z < a) << endl; // false
  cout << (a < z) << endl; // true
}
intmain()
{
常量std::字符串a(“a”);
常量std::字符串z(“z”);
cout在声明中:

cout << ("A"< "Z");

然后,对C++中的代码> > STD::String .< /P>< P> C++中的比较操作符进行正确的比较,结果未指定。我将使用C++ 11。 首先,我们必须了解字符串文字的类型

§2.14.5

9
普通字符串文字和UTF-8字符串文字也是 称为窄字符串文字。窄字符串文字具有 键入“数组的n
const char
”,其中n是字符串的大小 如下定义,并具有静态存储持续时间(3.7)

通俗地说,数组会衰减为指针

§4.2

1
类型为“数组of
nt
”或“数组of unknown”的左值或右值
T
”的范围可以转换为“指向
T
”类型的PR值。 结果是指向数组第一个元素的指针

由于字符串文字都包含一个字符,因此它们的类型相同(
char[2]
,包括空字符)

因此,以下段落适用:

§5.9

2
[…]

指向相同类型的对象或函数的指针(在指针之后 转换)进行比较,结果定义如下:

[……]

-如果相同类型的两个指针
p
q
指向不同的 不是同一对象的成员的对象或 同一数组或不同的函数,或者如果其中只有一个为空, 未指定
pq
p=q
的结果

未指定意味着行为取决于实现。我们可以看到GCC对此给出了警告:

warning: comparison with string literal results in unspecified behaviour [-Waddress]
     std::cout << ("Z" < "A");
警告:与字符串文字进行比较会导致未指定的行为[-Waddress]

std::cout您正在比较内存地址。下面的示例说明了如何比较两个字符串:

#include "stdafx.h"
#include <iostream>
#include <cstring> //prototype for strcmp()

int _tmain(int argc, _TCHAR* argv[])
{
 using namespace std;

 cout << strcmp("A", "Z"); // will print -1
 cout << strcmp("Z", "A"); // will print 1

 return 0;
}
#包括“stdafx.h”
#包括
#包括//strcmp()的原型
int _tmain(int argc,_TCHAR*argv[]
{
使用名称空间std;
CUT< P> C++中的字符串常量(“A”和“Z”)由C概念数组表示,其中最后一个字符是“0”,这些常数必须与函数的StrcMP-()类型进行比较。

如果您想使用C++ STD::字符串比较,必须显式声明:

cout << (std::string( "A") < "Z");

cout一个字符串表示指向内存区域的指针。因此,您首先仅将内存地址与此类代码进行比较

"Z"< "A"

<> p>这里你发现了一些“问题”,但你可以通过将文字转换成代码“STD::String :<代码> STD::CUTFIY字符串可以转换成C++字符串,然后与典型的操作符进行比较。<代码> STD::Str1s1=“A”;<代码> ETCor,因为C++ 14简单地<代码>(“A”s < z)s。
。寻找面试问题的人,请注意!您可能应该提到实际比较这些问题的方法。我认为值得注意的是,这与“老派c”中的情况完全相同我惊讶地发现C++不支持for比较。@ WiMeMutt我编辑指出,它们本身不是字符串,但是<代码> Char < /Case>数组,因为来自其他语言的人经常忘记这一点。@ Roland Nope,至少在C++ 11中未指定。“如果同一类型的两个指针p和q指向不同的对象,而这些对象不是同一对象的成员或同一数组的元素或指向不同的函数,或者如果只有一个指针为null,则pq,p=q的结果是未指定的值得注意的是,这些不是C++ <代码> STD::String 类型字符串,而是 char */COD> C风格字符串。
warning: comparison with string literal results in unspecified behaviour [-Waddress]
     std::cout << ("Z" < "A");
#include "stdafx.h"
#include <iostream>
#include <cstring> //prototype for strcmp()

int _tmain(int argc, _TCHAR* argv[])
{
 using namespace std;

 cout << strcmp("A", "Z"); // will print -1
 cout << strcmp("Z", "A"); // will print 1

 return 0;
}
cout << (std::string( "A") < "Z");
"Z"< "A"
int result = strcmp("Z", "A");