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++ 为什么一个表达式中的std::string串联会给出与逐字符不同的结果?_C++_String_Stl - Fatal编程技术网

C++ 为什么一个表达式中的std::string串联会给出与逐字符不同的结果?

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

我从std::字符串的中间连接了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]在字符类型上使用内置的+:每个参数都升级为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标准库中定义的用户定义的文本。

s3+=s1[4];公司使用std::string上的重载+=运算符作为char参数。它被定义为将字符连接到字符串

最后,从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。我在回答中又加了些牛肉。