在 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
并且不附加 a
和 b
个字符。
为什么第一个示例追加字符而第二个示例不追加?
这是运算符重载的缺点;人们需要记住,它只不过是一种语法糖和一种调用函数的好方法。
s += 'a' + 'b';
被分组,就像
这样的简单表达式一样
a += 1 + 2;
对于 int
类型 a
。
换句话说,首先计算 'a' + 'b'
。由于参数提升规则,它具有 int
类型。对于 int
,std::string
没有针对 +=
的特定重载,只有一个通常是缩小转换,因此编译器会发出警告。
如果要将 "ab"
附加到字符串 s
,则使用
s += "ab";
这与运算符优先级有关。让我们以表达式为例:
string s = "";
s += '0' + '1';//here + has higher precedence than +=
此处 +
的优先级高于 +=
,因此字符 '0'
和 '1'
被组合为 ('0' + '1')
。所以上面相当于写:
s+=('0' + '1');
Next,两个'0'
都存在从char
到int
的隐式转换和 '1'
。所以 '0'
变成十进制的 48 而字符 '1'
变成十进制的 49.
所以基本上上面的内容减少到:
s+=(48 + 49);
或
s+=(97);
现在 97 对应字符 a
,因此附加到名为 s
的字符串变量的最终结果是字符 a
.
现在让我们将其应用到您的示例中:
string s = "";
s += 'a' + 'b';
首先 由于优先级:
s+=('a' + 'b');
从 char
到 int
的第二个 隐式转换发生:
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'
,然后计算赋值 =
。因此,它将假设它是两个 char
s 的加法,通常是引擎盖下的 1 字节整数。
将 a
和 b
的 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
希望这对您有所帮助。
使用 +
是在 C++ 中将字符附加到字符串的有效方法,如下所示:
string s = "";
s += 'a';
然而,
string s = "";
s += 'a' + 'b';
给出 warning: implicit conversion from 'int' to 'char' changes value
并且不附加 a
和 b
个字符。
为什么第一个示例追加字符而第二个示例不追加?
这是运算符重载的缺点;人们需要记住,它只不过是一种语法糖和一种调用函数的好方法。
s += 'a' + 'b';
被分组,就像
这样的简单表达式一样a += 1 + 2;
对于 int
类型 a
。
换句话说,首先计算 'a' + 'b'
。由于参数提升规则,它具有 int
类型。对于 int
,std::string
没有针对 +=
的特定重载,只有一个通常是缩小转换,因此编译器会发出警告。
如果要将 "ab"
附加到字符串 s
,则使用
s += "ab";
这与运算符优先级有关。让我们以表达式为例:
string s = "";
s += '0' + '1';//here + has higher precedence than +=
此处 +
的优先级高于 +=
,因此字符 '0'
和 '1'
被组合为 ('0' + '1')
。所以上面相当于写:
s+=('0' + '1');
Next,两个'0'
都存在从char
到int
的隐式转换和 '1'
。所以 '0'
变成十进制的 48 而字符 '1'
变成十进制的 49.
所以基本上上面的内容减少到:
s+=(48 + 49);
或
s+=(97);
现在 97 对应字符 a
,因此附加到名为 s
的字符串变量的最终结果是字符 a
.
现在让我们将其应用到您的示例中:
string s = "";
s += 'a' + 'b';
首先 由于优先级:
s+=('a' + 'b');
从 char
到 int
的第二个 隐式转换发生:
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'
,然后计算赋值 =
。因此,它将假设它是两个 char
s 的加法,通常是引擎盖下的 1 字节整数。
将 a
和 b
的 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
希望这对您有所帮助。