当 RHS 有多个字符串或字符时,C++11 += 运算符不起作用

Posted

技术标签:

【中文标题】当 RHS 有多个字符串或字符时,C++11 += 运算符不起作用【英文标题】:C++11 += operator not working when RHS has more than one string or character 【发布时间】:2019-10-28 12:45:55 【问题描述】:

我正在使用c++11。当我使用+= 运算符连接字符串或字符时,它不起作用,但是= 起作用。

例如我独立使用了以下所有测试用例,即单独使用。

    string s="abdddddd";
    string ss="";
    ss+=s[0];//working
    ss+=s[0]+s[1]; //not working     output: Ã
    ss+="hi"+s[2];  //not working      no output
    ss+='d'+'c';  //not working      output: З
    ss+="hi"+"string"; //not working  error: invalid operands of types ‘const char [3]’ and ‘const char [7]’ to binary ‘operator+’

    string another="this";
    ss+=another+'b'; //working
    ss+="hi"+another;//working
    ss+=("hi"+s[3]); //not working
    ss=ss+"hi"+s[3]; //working
    ss=ss+"hi"+"this"; //working

添加括号也不起作用。所以,我想知道为什么它不适用于字符串,它适用于添加整数。

【问题讨论】:

想想s 的每个元素到底是什么,以及像"hi" 这样的文字字符串会衰减到什么。然后想想将两个字节相加会如何创建一个有效的字符串,或者当你将一个指针和一个字节相加时会发生什么。 ss += "hi" + "string";: 这样可以编译吗? @Jabberwocky no. 您了解ss += "hi" + "string"; 的错误信息吗? 应该使用std::stringstream(这使得在这种情况下一切都变得简单),或者使用"hi"s字符串文字,或者包装在string("hi")中用于C风格的字符串或string(1, 'c')用于单特点。不能期望对非字符串对象进行字符串连接操作。 【参考方案1】:

你的问题不是+=,而是+

例如,ss+=s[0]+s[1];s[0]s[1] 的类型为 char。添加它们将添加它们的整数表示(ASCII 代码)并将这个和代表的字符连接到ss

您在 ss+='d'+'c'; 中看到了同样的情况,您在其中明确给出了 char 文字。

仅使用+std::stringstd::string 或一个std::string 与字符或字符串文字连接。您不能将两个字符串文字或两个字符或字符串文字与一个字符连接起来。 (在所有这些情况下,+ 的语义与字符串连接不同,甚至不是有效的语法。)

【讨论】:

为什么ss=ss+"hi"+s[3] 有效?另外,如果我可以使用a="b"+"c",为什么不能使用a+="b"+"c" @Prvt_Yadav - 因为右侧的ssstd::string 并且因为'+' 保留关联。 @Prvt_Yadav 扩展@mhhollomon 评论:ss=ss+"hi"+s[3] 被视为ss=((ss+"hi")+s[3]),因此每个+ 左操作数都是std::string @Prvt_Yadav 你也不能使用a="b"+"c"。这将导致与ss+="hi"+"string"; 相同的错误。 ss=ss+"hi"+s[3] 之所以起作用,是因为上面的 cmets 解释了运算符关联性。 @uneven_mark 如果我使用string2="something",并使用这个字符串string2,那么它可以工作。

以上是关于当 RHS 有多个字符串或字符时,C++11 += 运算符不起作用的主要内容,如果未能解决你的问题,请参考以下文章

比较C中两个字符串的每个字符

当使用多个规则时,规则应该返回一个字符串或布尔值,而不是接收到的“对象”

re模块

复制构造函数中的c ++用户定义成员

为啥 C11 或 C++11 中没有 ASCII 或 UTF-8 字符文字?

Python3 正则表达式