Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么在通过添加字符串文字和字符进行初始化时,字符串没有被打印出来_C++_String - Fatal编程技术网

C++ 为什么在通过添加字符串文字和字符进行初始化时,字符串没有被打印出来

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

在案例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”+“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'
字符之后

使用这样的指针初始化
std::string
会产生未定义的行为


“代码2”的作用是std::string有一个操作符+=(),它接受一个char,并将其附加到字符串的末尾。

请先创建答案,然后发布,不要编辑上千次!这样做永远不会赢得FGITW;
sizeof(s)与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的命名空间污染效应,应该首选前者他是后者。