Lea*_*pcs 3 c++ pointers string-literals relational-operators
首先,考虑这个例子:
#include <iostream>
using namespace std;
int main()
{
    cout << ("123" == "123");
}
我期望什么:由于“123”是一个const char*,我期望对这些字符串的地址(如这些答案之一所述)进行比较。
...因为
!=和==只会比较这些字符串的基地址。不是字符串本身的内容。
但输出仍然是1. 好吧,我们实际上不知道如何比较两个纯右值对象的地址(或者至少我不明白它是如何完成的)。因此,让我们将这些字符串声明为变量,看看会发生什么:
#include <iostream>
using namespace std;
int main()
{
    const char* a = "1230";
    const char* b = "1230";
    cout << (a == b);
}
输出仍然是1. 那么const char*琴弦不会衰减吗?或者编译器设法进行一些优化并仅为一个字符串分配内存?好吧,让我们尝试避免它们:
#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:
#include <iostream>
using namespace std;
int main()
{
    const char* a = "1230";
    const char* b = "1231";
    cout << (a > b);
}
ab就词典比较而言,小于,但此处a更大。那么const char*s的比较是如何实现的呢?
是的,链接的答案是正确的。operator==对于指针来说,只比较地址,而不比较内容。
此外,编译器可以自由(但不是必需)去重复字符串文字,因此字符串文字的所有出现都是相同的对象,具有相同的地址。这就是您所观察到的情况,重新分配b = "1230";不会阻止这种情况。
[lex.string.14]评估字符串文字会产生具有静态存储持续时间的字符串文字对象,该对象根据上面指定的给定字符进行初始化。未指定所有字符串文字是否不同(即存储在不重叠的对象中)以及字符串文字的连续计算是否产生相同或不同的对象。
应该const char*腐烂到什么程度?数组会衰减,而指针不会。
#include <iostream>
using namespace std;
int main()
{
    const char* a = "1230";
    const char* b = "1231";
    cout << (a > b);
}
返回1只是因为a碰巧指向比 更高的地址b,所以没有进行字典比较。如果您需要的话,只需使用std::stringor即可。std::string_view