str.size() 输出结果不一样
str += 'a' + 'a';//报错
闭关修行中......
这是因为:前者先做'\0'+'a'得到'a',所以实际上只是append了一个字符
而后者append了两个字符。
其实两者的输出应当是:
ABCDa5 ABCD\0a6
因为\0在终端中不显示,所以你看不到
你贴的那个新产生的错误的原因是'a' = 9797 + 97 = 194超出了0-127这个ascii字符的范围,所以从数值隐式转换成字符报warning了
这里是char类型,不是常量字符串,首先根据优先级,会先计算后面的'0'+'a',对于char类型,相加还是一个char类型('a'),所以+=char类型,实际只append了一个字符。
¦ /** ¦ * @brief Append a character. ¦ * @param c The character to append. ¦ * @return Reference to this string. ¦ */ ¦ basic_string& ¦ operator+=(_CharT __c) ¦ { this->push_back(__c); return *this; ¦ }
这是因为(1)运算符优先级不同,+高于+=;(2)加法的操作数(operand)不同。
+
+=
s += '\0' + 'a';
等价于
s += ('\0' + 'a');
类似于
s = s + ('\0' + 'a');
char tmp = '\0' + 'a'; s += tmp;
两个char类型的变量(字符)做加法,相当于把两个字符对应的数值相加,所以'\0'+'a'等价于0 + 97,其结果为97即字符'a'。
char
'\0'+'a'
0 + 97
97
'a'
而
s += '\0'; s += 'a';
std::string tmp = s + '\0'; s = tmp + 'a';
std::string与char做加法,相当于把字符附加到字符串末尾,所以s + '\0'表示在字符串末尾增加一个'\0'字符。
std::string
s + '\0'
'\0'
至于str += 'a' + 'a';//报错的警告就是 @碎镜 解释的原因,即字符溢出。
'0' + 'a' 得到的是一个新的字符, 所以 你这样相当于:
char c = '\0' + 'a'; s += c; // 只是添加了一个字符
这是因为:前者先做'\0'+'a'得到'a',所以实际上只是append了一个字符
而后者append了两个字符。
其实两者的输出应当是:
因为\0在终端中不显示,所以你看不到
你贴的那个新产生的错误的原因是'a' = 97
97 + 97 = 194
超出了0-127这个ascii字符的范围,所以从数值隐式转换成字符报warning了
这里是char类型,不是常量字符串,首先根据优先级,会先计算后面的'0'+'a',对于char类型,相加还是一个char类型('a'),所以+=char类型,实际只append了一个字符。
发代码的时候请不要发截图。
这是因为(1)运算符优先级不同,
+
高于+=
;(2)加法的操作数(operand)不同。等价于
类似于
等价于
两个
char
类型的变量(字符)做加法,相当于把两个字符对应的数值相加,所以'\0'+'a'
等价于0 + 97
,其结果为97
即字符'a'
。而
类似于
std::string
与char
做加法,相当于把字符附加到字符串末尾,所以s + '\0'
表示在字符串末尾增加一个'\0'
字符。至于
str += 'a' + 'a';//报错
的警告就是 @碎镜 解释的原因,即字符溢出。'0' + 'a' 得到的是一个新的字符, 所以 你这样相当于: