我正在从std :: string的中间连接3个字符。如果我用char做char,我会得到预期的结果,但如果我只在一个表达式中做,我会得到一个奇怪的结果。为什么呢?
#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; // ?????
}
答案 0 :(得分:8)
s1[4]+s1[5]+s1[6]
使用+
类型的内置char
:每个参数都提升为int
,表达式为int
类型。将此值分配给s2
时,会调用重载的=
运算符到char
,并且在分配之前将表达式截断为char
。如果您的平台上char
为signed
,那么这是实施定义。请参阅http://en.cppreference.com/w/cpp/language/implicit_conversion。
s3+=s1[4];
公司使用+=
上的重载std::string
运算符作为char
参数。这被定义为将char
连接到字符串。
最后从C ++ 14开始,你可以使用漂亮的
s2 = ""s + s1[4] + s1[5] + s1[6];
如果substr
无法解决问题(s2 = s1.substr(4, 3);
会在这种情况下完成工作)。请注意C ++ 14标准库中定义的用户定义的文字 ""s
。