在 C++ 中将多个字符附加到字符串

Append multiple chars to string in C++

使用 + 是在 C++ 中将字符附加到字符串的有效方法,如下所示:

string s = "";
s += 'a';

然而,

string s = "";
s += 'a' + 'b';

给出 warning: implicit conversion from 'int' to 'char' changes value 并且不附加 ab 个字符。

为什么第一个示例追加字符而第二个示例不追加?

这是运算符重载的缺点;人们需要记住,它只不过是一种语法糖和一种调用函数的好方法。

s += 'a' + 'b';

被分组,就像

这样的简单表达式一样
a += 1 + 2;

对于 int 类型 a

换句话说,首先计算 'a' + 'b'。由于参数提升规则,它具有 int 类型。对于 intstd::string 没有针对 += 的特定重载,只有一个通常是缩小转换,因此编译器会发出警告。

如果要将 "ab" 附加到字符串 s,则使用

s += "ab";

这与运算符优先级有关。让我们以表达式为例:

string s = "";
s += '0' + '1';//here + has higher precedence than +=

此处 + 的优先级高于 +=,因此字符 '0''1' 被组合为 ('0' + '1')。所以上面相当于写:

s+=('0' + '1');

Next,两个'0'都存在从charint隐式转换'1'。所以 '0' 变成十进制的 48 而字符 '1' 变成十进制的 49.

所以基本上上面的内容减少到:

s+=(48 + 49);

s+=(97);

现在 97 对应字符 a,因此附加到名为 s 的字符串变量的最终结果是字符 a.

现在让我们将其应用到您的示例中:

string s = "";
s += 'a' + 'b';

首先 由于优先级:

s+=('a' + 'b');

charint 的第二个 隐式转换发生:

s+=(97 + 98);

所以

s+=195;

所以十进制195对应的字符会被追加到字符串s中

您可以尝试添加和减去不同的字符以确认是否发生这种情况。

Why does the first example append the char and the second does not?

所以根本原因是运算符优先级。

改成这样:

s += 'a';
s += 'b';

简单来说,std::string::operator+=() 并没有如你所愿,因为在语句 s += 'a' + 'b'; 中, priority/precedence + 大于赋值运算符 =。这意味着编译器将首先计算 'a' + 'b',然后计算赋值 =。因此,它将假设它是两个 chars 的加法,通常是引擎盖下的 1 字节整数。

ab 的 ASCII 值相加将 return 97+98 == 195 但 [= 的最大值19=] 是 255。所以这将导致溢出然后环绕并最终导致 195-256 == -61 并且 -61 不是 ASCII 的一部分所以你会看到取决于您的特定终端。

s += 'a' + 'b'; 就像您尝试添加两个 ASCII 值,然后将结果 char(特定于终端)附加到 s。这就是为什么您没有看到打印出您想要的字符的原因。

当我运行这段代码时:

#include <iostream>


int main()
{
    std::string str( "" );
    str += 'a' + 'b';
    std::cout << "The char is: " << str[ 0 ]
              << " and its ASCII value is: " << +str[ 0 ] << '\n';

    return 0;
}

在 Windows 命令提示符中,我看到以下内容:

The char is: ├ and its ASCII value is: -61

希望这对您有所帮助。