为什么一个表达式中的 std::string 连接给出的结果与逐个字符不同的结果?

Why std::string concatenation in one expression gives different result than char by char?

本文关键字:结果 字符 连接 表达式 一个 std string 为什么      更新时间:2023-10-16

我正在从 std::string 的中间连接 3 个字符。如果我逐个字符地执行,我会得到预期的结果,但是如果我只在一个表达式中执行此操作,我会得到一个奇怪的结果。为什么?

#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]char类型使用内置+:每个参数都提升为int,表达式是int类型。当它被分配给s2时,将调用重载的=运算符char,并且表达式在赋值之前被截断为char。如果您的平台上signedchar,则这是定义的实现。请参阅 http://en.cppreference.com/w/cpp/language/implicit_conversion。

s3+=s1[4];和公司使用重载的+=运算符在std::stringchar参数。定义为char连接到字符串。

最后从C++14开始,你可以使用美丽的

s2 = ""s + s1[4] + s1[5] + s1[6];

如果substr不能来救你(s2 = s1.substr(4, 3);会在这种特殊情况下完成这项工作(。请注意 C++14 标准库中定义的用户定义的文字""s