C++ 为什么在通过添加字符串文字和字符进行初始化时,字符串没有被打印出来
在案例1中,当我初始化如下字符串时,输出为空白:C++ 为什么在通过添加字符串文字和字符进行初始化时,字符串没有被打印出来,c++,string,C++,String,在案例1中,当我初始化如下字符串时,输出为空白: #include <iostream> #include<string> using namespace std; //CODE 1 int main() { string s="hello" + 'c'; cout<<s<<endl; return 0; } #包括 #包括 使用名称空间std; //代码1 int main() { 字符串s=“hello
#include <iostream>
#include<string>
using namespace std;
//CODE 1
int main()
{
string s="hello" + 'c';
cout<<s<<endl;
return 0;
}
#包括
#包括
使用名称空间std;
//代码1
int main()
{
字符串s=“hello”+“c”;
cout因为“string”
不是一个std::string
而是一个const char*
,指针加上一个数字(一个字符“只是”一个数字)使用指针算术,所以在加法之后,您将得到一个const char*
,它可能指向字符串文本后面的垃圾内存
第二个示例之所以有效,是因为在本例中,s
是一个std::string
,它有一个操作符+=
,用于字符,并且不使用指针算术。代码不相同
string s="hello" + 'c';
“hello”
不是一个std::string
。它是一个字符串文本,类型为const char[N]
。当向数组中添加一个字符时,它将衰减为指针,并执行指针算术。该算术将超过字符串文本的结尾,因此它是未定义的行为
为了使第一个代码的行为与第二个示例类似,您需要将“hello”
设置为字符串。您可以使用用户定义的文本作为std::string
like
string s = "hello"s + 'c';
或者只使用构造函数调用,如
string s = std::string("hello") + 'c';
当你有
string s="hello" + 'c';
等于
string s=("hello" + 'c');
和它一样
string s=("hello" + 99);
string s=(&"hello"[99]);
这和
string s=("hello" + 99);
string s=(&"hello"[99]);
也就是说,您将获得一个指向字符串“hello”
的第100个元素的指针,该元素只有六个元素(不要忘记终止符)
越界会导致未定义的行为。表达式“hello”+“c”
;正在将char
类型添加到const char[6]
类型,结果不明显。形式上,第一个参数衰减为const char*
指针,然后使用指针算术的常规规则将c
添加到该指针。该行为可能未定义,因为在我遇到的所有编码中,c
的数值都大于6,因此,您最终尝试在const char
数组“hello”
之外索引一个元素
在第二个版本中,您正在利用std::string
类的重载+=
运算符,将char
作为参数,并将字符c
连接到该字符串。“hello”+“c”
给出一个指针,指向“hello”
(例如,假设一个ASCII字符集,'c'
具有数值99
,并且“hello”+99
给出一个指向内存位置的指针,该内存位置在“hello”
中的'h'
字符之后大约和独木舟上的活板门一样有用。使用这样的指针初始化
sizeof(s)与会产生未定义的行为std::string
“代码2”的作用是std::string
有一个操作符+=()
,它接受一个char
,并将其附加到字符串的末尾。请先创建答案,然后发布,不要编辑上千次!这样做永远不会赢得FGITW;sizeof(std::string)相同
sizeof(“hello”)
是sizeof(const char[6])
它是sizeof(6*char)
它是6*sizeof(char)
它是6,正如标准所规定的sizeof(char)
to be 1。@芭丝谢芭,不然我们怎么放水?;)@infinite这是一个完全不同的问题,是关于名称空间以及从另一个名称空间中引入符号时会发生什么。链接的问题不是指“字符串”在一般情况下,只需将std::string
类作为string
拉入当前名称空间。我已经编辑了这个问题,请您进一步澄清。@infinite我们说的是“您好”
不是字符串/std::string。那么它是什么呢?为什么还要麻烦使用“type”作为字符串进行初始化?你能给我一些参考文本来进行准确的说明吗?提前谢谢这个答案非常清楚。你最好研究一下“C++中的字符串文本”@infinite,就像我在回答中说的那样使用“你好”s
使其成为std::string
。您好,我已经编辑了这个问题,请您进一步澄清一下好吗?使用std::string s;
生成的s
类型与使用命名空间std;string s;生成的类型没有区别。尽管由于t的命名空间污染效应,应该首选前者他是后者。