当前位置: 首页 > 知识库问答 >
问题:

如何比较常量字符*字符串?

魏学智
2023-03-14

首先,考虑这个例子:

#include <iostream>
using namespace std;

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

我期望什么:因为“123”是一个< code>const char*,我期望这些字符串的地址(就像其中一个答案所说的)被比较。

…因为===将只比较这些字符串的基址。不是字符串本身的内容。

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

#include <iostream>
using namespace std;

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

输出仍然是 1。所以常量字符*字符串不会衰减吗?或者编译器设法做了一些优化,只为一个字符串分配内存?好吧,让我们尽量避免它们:

#include <iostream>
using namespace std;

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

结果还是一样的。这让我认为constchar*真的不会衰减。但这并没有让我的生活变得简单。然后如何比较const char*s?

为什么这里的输出是1

#include <iostream>
using namespace std;

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

词典比较而言,a小于b,但这里a更大。那么如何实现常量字符的比较呢?

共有3个答案

湛嘉歆
2023-03-14

在这个比较中

"123" == "123"

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

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

至于这个程序

#include <iostream>
using namespace std;

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

那么你就不能使用这个运算符

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

袁山
2023-03-14

C标准完全没有指定文字字符串的存储细节(除了它们的生命周期),完全由编译器自行决定。例如:

const char *a="ABCDEFG";
const char *b="DEFG";

智能编译器完全有可能只产生一个字符串,并将第二个指针指向字符串的中间。

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

类似地,指针比较也是为C标准中未明确指定的所有其他情况定义的实现。指针比较有一个定义的行为,主要是针对指向同一数组或向量成员的指针,通常情况下是完全未指定的。在C标准中,有一些方法可以实现指针的总顺序,但这与此无关。

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

白刚洁
2023-03-14

是的,链接的答案是正确的。对于指针,operator== 只是比较地址,而不比较其内容。

此外,编译器可以自由地(但不是必需的)来消除重复的字符串文本,因此字符串文本的所有实例都是相同的对象,具有相同的地址。这就是你观察到的,并重新分配b = “1230”;不会阻止它。

[lex.string.14] 计算字符串文本会生成一个具有静态存储持续时间的字符串文本对象,该对象由上面指定的给定字符初始化。是否所有字符串文本都是不同的(即,存储在非重叠对象中),以及字符串文本的连续计算是否产生相同或不同的对象是未指定的。

常量字符*应该衰减到什么程度?数组会衰减,指针不会衰减。

#include <iostream>
using namespace std;

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

返回 1 只是因为 a 碰巧指向比 b 更高的地址,因此没有进行词典比较。如果需要,只需使用 std::字符串std::string_view

 类似资料:
  • 问题内容: 我听说散列(即将字符串或对象转换为数字)用于字符串等,因为比较数字比字符串更容易。如果为真,这是什么原因? 问题答案: 不一定是这种情况,但大多数时候可能是这样。 请考虑以下情况: 我想比较字符串“ apples”和“ oranges”。如果我只想确定“ apples” ==“ oranges”,我只需要比较每个字符串的第一个字符:’a’!=’o’=>“ apples”!=“ oran

  • 问题内容: 我想知道如何在一行中比较多个字符串。我尝试使用|| 但不适用于布尔值或字符串。这是我的代码是什么样的: 对于那些将其标记为重复的对象,我在此处检查了200多个关于堆栈溢出的问题,但没有一个起作用。@Chrylis发布的一个实际上没有帮助。他们只是在问==和.equals()的区别 问题答案: 首先,不要用于字符串。稍后您将了解原因。您想按字符串的内容而不是它们在内存中的位置比较字符串。

  • 主要内容:equals() 方法,equalsIgnoreCase() 方法,equals()与==的比较,compareTo() 方法字符串比较是常见的操作,包括比较相等、比较大小、比较前缀和后缀串等。 在 Java 中,比较字符串的常用方法有 3 个:equals() 方法、equalsIgnoreCase() 方法、 compareTo() 方法。下面详细介绍这 3 个方法的使用。 equals() 方法 equals() 方法将逐个地比较两个字符串的每个字符是否相同。如果两个字符串具有相

  • 我是MVC编程的新手。所以我用的是play框架。 获取未捕获的引用Error:未定义MODERATED

  • 问题内容: 我有一个程序正在制作,当用户输入一种心情时,它将在此基础上输出报价。我需要告诉程序 问题是,我不知道如何使程序识别输入并基于该输出文本…这是到目前为止我所拥有的代码。 问题答案: 首先,看起来您正在处理错误的变量。我想你打算比较。 处理字符串时,请始终使用而不是。比较参考值(通常不可靠),同时比较实际值。 将您的字符串转换为全部大写或全部小写也是一个好习惯。在本示例中,我将使用小写字母