Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.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++ std::string和int的串联导致移位。为什么? 今天,当我尝试用一个int来连接一个STD::string时,我感到惊讶。 包括 包括 void printcont std::字符串和文本 { std::cout_C++_String_C++11_Concatenation - Fatal编程技术网

C++ std::string和int的串联导致移位。为什么? 今天,当我尝试用一个int来连接一个STD::string时,我感到惊讶。 包括 包括 void printcont std::字符串和文本 { std::cout

C++ std::string和int的串联导致移位。为什么? 今天,当我尝试用一个int来连接一个STD::string时,我感到惊讶。 包括 包括 void printcont std::字符串和文本 { std::cout,c++,string,c++11,concatenation,C++,String,C++11,Concatenation,这条线就是问题所在: print("iteration_" + 1); 字符串文字正在衰减为字符*。您正在将1添加到此字符*,并将其移动到下一个字符 如果要将字符串1添加到文本的末尾,一种相当简单的方法是将字符串文本传递给std::string构造函数,并手动将1转换为字符串。例如: print(std::string("iteration_") + std::to_string(1)); 这条线就是问题所在: print("iteration_" + 1); 字符串文字正在衰减为字符*。

这条线就是问题所在:

print("iteration_" + 1);
字符串文字正在衰减为字符*。您正在将1添加到此字符*,并将其移动到下一个字符

如果要将字符串1添加到文本的末尾,一种相当简单的方法是将字符串文本传递给std::string构造函数,并手动将1转换为字符串。例如:

print(std::string("iteration_") + std::to_string(1));

这条线就是问题所在:

print("iteration_" + 1);
字符串文字正在衰减为字符*。您正在将1添加到此字符*,并将其移动到下一个字符

如果要将字符串1添加到文本的末尾,一种相当简单的方法是将字符串文本传递给std::string构造函数,并手动将1转换为字符串。例如:

print(std::string("iteration_") + std::to_string(1));
字符串是否因某种原因被转换为char[]

实际上是另一种方式。迭代是一个字符[11],当您添加1时,它会衰减为常量字符*。指针递增1会使其指向字符串中的下一个字符。然后,这将用于构造一个临时std::字符串,该字符串包含除第一个字符以外的所有字符

您链接的文档是针对运算符+of std::string的,但要使用它,您首先需要一个std::string

字符串是否因某种原因被转换为char[]

实际上是另一种方式。迭代是一个字符[11],当您添加1时,它会衰减为常量字符*。指针递增1会使其指向字符串中的下一个字符。然后,这将用于构造一个临时std::字符串,该字符串包含除第一个字符以外的所有字符


您链接的文档适用于运算符+of std::string,但要使用它,您首先需要一个std::string。

如果您尝试使用以下内容:

std::string str=iteration+1; 编译器将抛出警告:

警告:向字符串添加“int”不会附加到字符串 [-Wstring+int]

这是因为您将迭代字符串的指针递增1,这意味着现在将迭代字符串分配给str变量

连接的正确方法是:

std::string str=iteration+std::to_string1;
如果您尝试使用以下各项:

std::string str=iteration+1; 编译器将抛出警告:

警告:向字符串添加“int”不会附加到字符串 [-Wstring+int]

这是因为您将迭代字符串的指针递增1,这意味着现在将迭代字符串分配给str变量

连接的正确方法是:

std::string str=iteration+std::to_string1; 迭代不是std::string,而是const char[],它会衰减为const char*,迭代1只执行指针算术,并将指针移动到下一个字符,即“t”,然后得到c样式的字符串变形

您可以使用将int转换为std::string,然后将它们连接起来

print("iteration_" + std::to_string(1));
对于这种情况,调用第一个参数迭代,隐式地将其转换为std::string,然后传递给运算符+,然后将连接的std::string传递给print

迭代不是std::string,而是const char[],它会衰减为const char*,迭代1只执行指针算术,并将指针移动到下一个字符,即“t”,然后得到c样式的字符串变形

您可以使用将int转换为std::string,然后将它们连接起来

print("iteration_" + std::to_string(1));
对于这种情况,调用第一个参数迭代,隐式地将其转换为std::string,然后传递给运算符+,然后将连接的std::string传递给print

表达式迭代_u1+1是添加到int 1的常量字符[11]文本

在该表达式中,迭代分解为指向数组第一个元素的const char*指针。+1然后在该指针上的指针算术中发生。整个表达式计算为指向第一个t的const char*类型,该t是std::string构造函数的有效NUL终止输入!匿名临时std::string绑定指向const std::string和function参数

这是完全有效的C++,有时可以很好的使用。 如果要将+视为串联,则

print("iteration_" + std::to_string(1));
是单向的。

表达式迭代+1是添加到int 1的常量字符[11]文本

在该表达式中,迭代分解为指向数组第一个元素的const char*指针。+1然后在该指针上的指针算术中发生。整个表达式计算为指向第一个t的const char*类型,该t是std::string构造函数的有效NUL终止输入!匿名临时std::string绑定指向const std::string和function参数

这是完全有效的C++,有时可以放进去。 od使用

如果要将+视为串联,则

print("iteration_" + std::to_string(1));

是一种方法。

@idclev463035818在发布后才意识到我的错误,更正了,谢谢:为什么是std::string构造函数?不是打印迭代+标准::到字符串1;够了吗?@DominikMokriš只是倾向于显式:@idclev463035818在发布后才意识到我的错误,更正了,谢谢:为什么使用std::string构造函数?不是打印迭代+标准::到字符串1;够了吗?@DominikMokriš只是一个显式的偏好:是的,你必须将1转换为字符串才能将其附加到字符串中。其他语言在你背后进行各种转换;C++通常试图使这类事情显式化,以便更容易理解代码实际上在做什么。是的,必须将1转换为字符串,以便将其附加到字符串。其他语言在你背后进行各种转换;C++通常试图使这类事情显式化,以便更容易理解代码实际上在做什么。