首先,考虑这个例子:
#include <iostream>
using namespace std;
int main()
{
cout << ("123" == "123");
}我期望什么:因为"123“是一个const char*,所以我希望对这些字符串的地址(就像其中一个答案说的)进行比较。
..。因为
!=和==只会比较这些字符串的基址。而不是字符串本身的内容。
但是输出仍然是1。好的,我们实际上不知道如何比较两个prvalue对象的地址(或者至少我不知道它是如何实现的)。因此,让我们将这些字符串声明为变量,看看会发生什么:
#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*的比较呢?
发布于 2021-11-21 12:51:25
是的,联系的答案是正确的。指针的operator==只是比较地址,而不是它们的内容。
此外,编译器对于去重复字符串文本是免费的,但不是必需的,因此字符串文本的所有出现都是相同的对象,具有相同的地址。这就是你所观察到的,重新分配b = "1230";不会阻止这一点。
[词汇表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::string或std::string_view即可。
发布于 2021-11-21 12:52:33
C++标准完全不指定文字字符串的存储细节(除了它们的生存期),这完全取决于编译器的判断。例如:
const char *a="ABCDEFG";
const char *b="DEFG";智能编译器完全可能只生成其中的一个字符串,并将第二个指针设置为指向字符串的中间。
来自不同.cpp文件的相同文字字符串也有可能在最终的链接可执行文件和最初完全在不同.cpp中编译的两个字符串中生成一个字符串,从而最终具有相同的实际指针值。
同样,指针比较也是为C++标准中未显式指定的所有其他情况定义的实现。指针比较通常是针对指向同一数组或向量的成员的指针进行定义的行为,而在一般情况下则完全不指定。在C++标准中,有一些方法可以实现指针的总顺序,但这与此无关。
总结:否则,您不能期望任何指针值的任何特定行为或特定含义。
发布于 2021-11-21 12:52:39
在这个比较中
"123" == "123"具有const char[4]类型的字符串文本被隐式转换为指向其第一个元素的指针,并对这些指针进行比较。
结果取决于编译器选项,这些选项指定相同的字符串文本是存储为一个字符串文本还是作为单独的字符串文本存储。
至于这个计划
#include <iostream>
using namespace std;
int main()
{
const char* a = "1230";
const char* b = "1231";
cout << (a > b);
}然后,您可能不会使用操作符>和指针,这些指针不指向同一个数组的元素。这种比较是没有定义的。
比较的结果取决于编译器将字符串文本放在字符串文本池中的顺序。
https://stackoverflow.com/questions/70054650
复制相似问题