代码是这样的,它输出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;
}
我知道我只能使用strcmp
测试两个c风格的字符串是否相等(因为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
答案 0 :(得分:11)
这里可能发生的是编译器/链接器将四个字符串文字合并为两个文字。因此,"nima"
和"123"
都具有相同的地址。
将地址存储在向量中并进行比较(operator==
在地址上)。由于地址相同,因此比较相同。
请注意,这是 accidential 。它只是“有效”,原因有两个:
stdin
读取的某些字符串)。这可能导致两种情况,你会得到一个有趣的惊喜(如果你必须找到它为什么它一直“工作”时突然不起作用),当你使用不同的编译器或甚至是具有不同优化设置的相同编译器,或者当您分配非文字字符串时。