【发布时间】:2021-12-31 09:32:03
【问题描述】:
首先,考虑这个例子:
#include <iostream>
using namespace std;
int main()
{
cout << ("123" == "123");
}
我期待什么:由于“123”是const char*,我希望比较这些字符串的地址(like one of these answers said)。
... 因为
!=和==只会比较它们的基地址 字符串。不是字符串本身的内容。
但输出仍然是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);
}
a 在词法比较方面小于b,但这里a 更大。那么const char*s的比较是如何实现的呢?
【问题讨论】:
-
a > b根本不进行字典比较。 -
比较地址。您的编译器将字符串 once 存储在只读内存中,复制它没有意义,因此它总是返回 true。
-
编译器对字符串文字进行重复数据删除。这就是为什么他们碰巧有相同的地址。
-
@tkausl - 你是对的,在这种情况下,编译器将字符串存储一次。这是一个实现细节,因此不一定总是正确的。相同的字符串文字可以分开存储。
标签: c++ pointers string-literals relational-operators