I want to test what if string append char’s size, and below is the outcome.
I know that the string end with the null character, but why the outcome is like that?
#include <iostream>
#include <string>
using namespace std;
int main(){
string a = "" + 'a'; //3
string b = "" + '1'; //2
string c = "a" + 'a'; //2
string d = "1" + '1'; //3
string e = "\0" + 'a'; //20
string f = "\0" + '1'; //1
string g = "a" + '\0'; //1
string h = "1" + '\0'; //1
string i = "" + '\0'; //0
string j = "" + '\0'; //0
cout << a.size() << endl;
cout << b.size() << endl;
cout << c.size() << endl;
cout << d.size() << endl;
cout << e.size() << endl;
cout << f.size() << endl;
cout << g.size() << endl;
cout << h.size() << endl;
cout << i.size() << endl;
cout << j.size() << endl;
return 0;
}
Your code is not doing what you think.
String literals decay to
const char *, andcharis an integer type. If you try to sum them, the compiler finds that the simplest way to make sense of that stuff is to convertchars toints, so the result is performing pointer arithmetic over the string literals – e.g.""+'a'goes to the 97th character in memory after the beginning of the string literal""(if'a'is represented by 97 on your platform).This results in garbage being passed to the
stringconstructor, which will store inside thestringbeing constructed whatever it finds at these locations of memory until it founds a\0terminator. Hence the “strange” results you get (which aren’t reproducible, since the exact memory layout of the string table depends from the compiler).Of course all this is undefined behavior as far as the standard is concerned (you are accessing
chararrays outside their bounds, apart from the cases where you add\0).To make your code do what you mean, at least one of the operands must be of type
string:or
so the compiler will see the relevant overloads of
operator+that involvestd::string.