3

代码是这样的,它输出1

int main(int argc, char *argv[])
{
    vector <const char*> vec = {"nima","123"};
    vector <const char*> vec2 = {"nima","123"};
    auto result = equal(vec.cbegin(), vec.cend(), vec2.cbegin());
    cout << result << endl;
    return 0;
}

我知道我只能通过 using 来测试两个 c 风格的字符串是否相等strcmp(因为char*它不是我理解的对象)。但这里equal有一个来自 的函数<algorithm>。它是否使运算符重载,==以便它可以测试两个的相等性char*

@Damon 说它们是相等的,因为据我了解,将相同的字符串文字合并到相同的地址中。但是,当我尝试char*使用不同的地址时,它仍然给我相同的结果:

int main(int argc, char *argv[])
{
char* k = "123";
char* b = "123";
vector <const char*> vec = {"nima"};
vector <const char*> vec2 = {"nima"};
cout << &k << endl;
cout << &b << endl;
vec.push_back(k);
vec2.push_back(b);

auto result = equal(vec.cbegin(), vec.cend(), vec2.cbegin());
cout << result << endl;
return 0;
}

结果是:

 0x7fff5f73b370
 0x7fff5f73b368
 1
4

1 回答 1

11

这里可能发生的是编译器/链接器将其中两个相同的四个字符串文字合并为两个文字。因此,两者"nima""123"具有相同的地址。

您将地址存储在向量中并比较它们(operator==在地址上)。由于地址相同,因此比较相等。

请注意,这是偶然的。由于两个原因,它只能“起作用”:

  1. 字符串是文字(也就是说,不是从 eg 读取的某些字符串stdin)。
  2. 允许编译器,但不需要合并相同的文字(是否发生这种情况是实现定义的)。

这可能会导致两种情况,您会得到一个有趣的惊喜(如果您必须找出为什么它在它一直“工作”时突然不工作,那就不是那么有趣了),无论是当您使用不同的编译器,甚至是相同的编译器时具有不同优化设置的编译器,或者当您分配非文字字符串时。

于 2013-02-16T14:02:39.860 回答