C++ 为什么一个表达式中的std::string串联会给出与逐字符不同的结果?
我从std::字符串的中间连接了3个字符。如果我一个字符一个字符地做,我会得到预期的结果,但是如果我只在一个表达式中做,我会得到一个奇怪的结果。为什么?C++ 为什么一个表达式中的std::string串联会给出与逐字符不同的结果?,c++,string,stl,C++,String,Stl,我从std::字符串的中间连接了3个字符。如果我一个字符一个字符地做,我会得到预期的结果,但是如果我只在一个表达式中做,我会得到一个奇怪的结果。为什么? #include <string> #include <iostream> using namespace std; int main() { string s1 = "abcdefghijklmnopq"; string s2 = ""; string s3 = ""; s3+=s
#include <string>
#include <iostream>
using namespace std;
int main()
{
string s1 = "abcdefghijklmnopq";
string s2 = "";
string s3 = "";
s3+=s1[4];
s3+=s1[5];
s3+=s1[6];
cout << s3 << endl; // Expected behaviour
s2=s1[4]+s1[5]+s1[6];
cout << s2 << endl; // ?????
}
s1[4]+s1[5]+s1[6]在字符类型上使用内置的+:每个参数都升级为int,并且表达式是int类型。当将其赋值给s2时,将调用重载的=运算符to char,并在赋值之前将表达式截断为char。如果char在您的平台上签名,则这是实现定义的。看
s3+=s1[4];公司使用std::string上的重载+=运算符作为char参数。它被定义为将字符连接到字符串
最后,从C++14开始,您可以使用
s2 = ""s + s1[4] + s1[5] + s1[6];
如果substr无法帮助您s2=s1。substr 4,3;在这种特殊情况下,他会做这项工作。注意在C++14标准库中定义的用户定义的文本。s2 = ""s + s1[4] + s1[5] + s1[6];
如果substr无法帮助您s2=s1。substr 4,3;在这种特殊情况下,他会做这项工作。注意C++14标准库中定义的用户定义的文本。您正在添加字符而不是std::strings您已经得到了解释原因的答案;一种解决方案是强制右侧变为std::string,这可以通过转换来实现:s3+=std::strings1[4]+s1[5]+s1[6];。这取决于+从左向右分组的规则,就好像右侧的表达式是std::strings1[4]+s1[5]+s1[6]编写的一样。如果您对此感到不舒服,您可以用一种看起来有些奇怪的形式编写它,它不依赖于分组:s1[4]+std::strings1[5]+s1[6];一种解决方案是强制右侧变为std::string,这可以通过转换来实现:s3+=std::strings1[4]+s1[5]+s1[6];。这取决于+从左向右分组的规则,就好像右侧的表达式是std::strings1[4]+s1[5]+s1[6]编写的一样。如果您对此感到不舒服,可以用一种看起来有些奇怪的形式编写它,它不依赖于分组:s1[4]+std::strings1[5]+s1[6];C++是反直觉的,字符的总和不是字符。在这种情况下,应该有一个连接运算符,以明确您不是在添加值,而是在连接它们。更令人费解的是,它允许将整数赋给字符串。@ManuelPastor:实际上,int被转换为char,而重载的=被调用为char。我在答案中添加了更多的内容。OP可能希望使用s2=s1.substr4,3;C++是反直觉的,字符的总和不是字符。在这种情况下,应该有一个连接运算符,以明确您不是在添加值,而是在连接它们。更令人费解的是,它允许将整数赋给字符串。@ManuelPastor:实际上,int被转换为char,而重载的=被调用为char。我在回答中又加了些牛肉。