C++ 字符串字面量相等检查?

2024-04-17

==不是我们比较两个数组的方式,因为那只会比较地址:

#include <iostream>

int main()
{
  char a[] = "aaa";
  char b[] = "aaa";

  if (a == b)
    std::cout << "Yes" << std::endl;
  else
    std::cout << "No" << std::endl;

  return 0;
}

这段代码甚至给了我一个警告:

数组比较的结果始终为 false

但是当我尝试这个时:

if ("aaa" == "aaa")

看起来效果很好。仍然给我一个警告,但警告是:

条件始终为真

起初,我认为这是某种缓存的东西,所以我尝试了一个相当不寻常的字符串文字:

if ("whuiwhqohqweihqweohi" == "whuiwhqohqweihqweohi")

在 MSVC 和 g++ 上仍然可以正常工作。这是依赖于实现的行为吗?我知道比较编译时已知的变量不是很有用,但我的问题只是“为什么会这样?”。

此外,使用auto似乎也在工作:

#include <iostream>

int main()
{
  auto a = "whuiwhqohqweihqweohi";
  auto b = "whuiwhqohqweihqweohi";
  if (a == b) {
    std::cout << "Yes" << std::endl;
  }
  else {
    std::cout << "No" << std::endl;
  }

  return 0;
}

该代码产生正确的输出。是什么类型的a and b here?

Please do not answer "Use std::string". It's irrelevant to my question


你必须的very这里要小心,因为您正在查看的某些案例与其他案例并不完全相同。

在你的第一个例子中:

char a[] = "aaa";
char b[] = "aaa";

if (a == b)

你正在创建两个arrayschar,每个都从字符串文字初始化。然后,您尝试将这些数组进行相互比较。在大多数情况下(包括这种情况),数组名称的计算结果为该数组中第一个元素的地址。所以你实际上是在比较两个数组的地址。这些不可能相同,因此比较保证会产生结果false.

在你的第二个例子中:if ("aaa" == "aaa"),您正在比较字符串文字他们自己,而不是从字符串文字初始化的数组。

标准不保证此结果。该标准允许(但不要求)将相同的字符串文字合并在一起。然而,再次强调,您真正比较的不是文字的内容,而是它们存储的地址。如果编译器合并字符串文字,使它们位于相同的地址,这将产生true。如果它让它们分开,它会产生false.

In your auto case:

auto a = "whuiwhqohqweihqweohi";
auto b = "whuiwhqohqweihqweohi";

你的情况也差不多——a and b两者最终都是指向 char 的指针,保存字符串文字的地址。如果编译器合并这些文字,它们将都指向相同的地址,因此它们比较相等。如果编译器不将它们合并在一起,每个都将有自己的地址,并且它们将比较不相等。

这里最重要的一点是,这些都没有比较contents字符串的所有内容,仅是它们存储的地址。内容仅在两个字符串文字具有(或至少以相同内容结尾)时才能合并的程度进行计算。

就“至少以”结尾而言,我指的是编译器如果有类似的内容:"wing"在一个地方并且"swing"在另一个例子中,编译器可以自由地将两者合并,因此代码如下:

auto a = "wing";
auto b = "swing";

...编译器可以存储swing放在一处,并初始化a指向该存储文字的第二个字符。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ 字符串字面量相等检查? 的相关文章

随机推荐