Reputation: 1613
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;
}
Upvotes: 0
Views: 108
Reputation: 126937
Your code is not doing what you think.
String literals decay to const char *
, and char
is an integer type. If you try to sum them, the compiler finds that the simplest way to make sense of that stuff is to convert char
s to int
s, 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 string
constructor, which will store inside the string
being constructed whatever it finds at these locations of memory until it founds a \0
terminator. 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 char
arrays 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
:
string c = string("a") + 'a';
or
string c = "a" + string("a");
so the compiler will see the relevant overloads of operator+
that involve std::string
.
Upvotes: 2
Reputation: 500893
Most of your initializers have undefined behaviour. Consider, for example:
string a = "" + 'a';
You are adding a char
to a char
pointer. This advances the pointer by the ASCII value of the char, and uses the resulting (undefined) C string to initialize a
.
To fix, change the above to:
string a = string("") + 'a';
Upvotes: 1