首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何比较const char*字符串?

问如何比较const char*字符串?
EN

Stack Overflow用户
提问于 2021-11-21 12:46:17
回答 4查看 231关注 0票数 3

首先,考虑这个例子:

代码语言:javascript
复制
#include <iostream>
using namespace std;

int main()
{
    cout << ("123" == "123");
}

我期望什么:因为"123“是一个const char*,所以我希望对这些字符串的地址(就像其中一个答案说的)进行比较。

..。因为!=和==只会比较这些字符串的基址。而不是字符串本身的内容。

但是输出仍然是1。好的,我们实际上不知道如何比较两个prvalue对象的地址(或者至少我不知道它是如何实现的)。因此,让我们将这些字符串声明为变量,看看会发生什么:

代码语言:javascript
复制
#include <iostream>
using namespace std;

int main()
{
    const char* a = "1230";
    const char* b = "1230";
    cout << (a == b);
}

输出仍然是1。所以const char*字符串不会衰变?或者编译器只为一个字符串做了一些优化并分配内存?好吧,让我们试着避开它们:

代码语言:javascript
复制
#include <iostream>
using namespace std;

int main()
{
    const char* a = "1230";
    const char* b = "1231";
    b = "1230";
    cout << (a == b);
}

结果仍然是一样的。这让我觉得const char*真的不会腐烂。但这并没有让我的生活变得简单。那么如何比较const char*s呢?

为什么这里的输出是1

代码语言:javascript
复制
#include <iostream>
using namespace std;

int main()
{
    const char* a = "1230";
    const char* b = "1231";
    cout << (a > b);
}

从词汇比较来看,a比b小,但在这里,a更大。那么如何实现const char*的比较呢?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2021-11-21 12:51:25

是的,联系的答案是正确的。指针的operator==只是比较地址,而不是它们的内容。

此外,编译器对于去重复字符串文本是免费的,但不是必需的,因此字符串文本的所有出现都是相同的对象,具有相同的地址。这就是你所观察到的,重新分配b = "1230";不会阻止这一点。

[词汇表14]计算字符串-文字结果为具有静态存储持续时间的字符串文本对象,该对象由上面指定的给定字符初始化。是否所有字符串文本都是不同的(也就是说,存储在不重叠的对象中),以及字符串-文字的连续计算是否产生相同的或不同的对象是未指定的。

const char*应该衰变到什么程度?数组衰减,指针不衰减。

代码语言:javascript
复制
#include <iostream>
using namespace std;

int main()
{
    const char* a = "1230";
    const char* b = "1231";
    cout << (a > b);
}

返回1,仅仅因为a碰巧指向比b更高的地址,就没有做任何地形比较。如果需要,只需使用std::string或std::string_view即可。

票数 5
EN

Stack Overflow用户

发布于 2021-11-21 12:52:33

C++标准完全不指定文字字符串的存储细节(除了它们的生存期),这完全取决于编译器的判断。例如:

代码语言:javascript
复制
const char *a="ABCDEFG";
const char *b="DEFG";

智能编译器完全可能只生成其中的一个字符串,并将第二个指针设置为指向字符串的中间。

来自不同.cpp文件的相同文字字符串也有可能在最终的链接可执行文件和最初完全在不同.cpp中编译的两个字符串中生成一个字符串,从而最终具有相同的实际指针值。

同样,指针比较也是为C++标准中未显式指定的所有其他情况定义的实现。指针比较通常是针对指向同一数组或向量的成员的指针进行定义的行为,而在一般情况下则完全不指定。在C++标准中,有一些方法可以实现指针的总顺序,但这与此无关。

总结:否则,您不能期望任何指针值的任何特定行为或特定含义。

票数 4
EN

Stack Overflow用户

发布于 2021-11-21 12:52:39

在这个比较中

代码语言:javascript
复制
"123" == "123"

具有const char[4]类型的字符串文本被隐式转换为指向其第一个元素的指针,并对这些指针进行比较。

结果取决于编译器选项,这些选项指定相同的字符串文本是存储为一个字符串文本还是作为单独的字符串文本存储。

至于这个计划

代码语言:javascript
复制
#include <iostream>
using namespace std;

int main()
{
    const char* a = "1230";
    const char* b = "1231";
    cout << (a > b);
}

然后,您可能不会使用操作符>和指针,这些指针不指向同一个数组的元素。这种比较是没有定义的。

比较的结果取决于编译器将字符串文本放在字符串文本池中的顺序。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70054650

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档