ostream und string operator+ Verwirrung
-
Ich habe hier den folgenden Code (credits to volkard)
cout << ""+strlen("char"); // -> "4" für ALLE Varianten mit variabl. " " cout << " "+strlen("char"); // -> "4" für ALLE Varianten mit variabl. " " cout << " "+strlen("char"); // -> "4" für ALLE Varianten mit variabl. " " // aber cout << ""+strlen("char") << "char"; // -> "rchar" cout << " "+strlen("char") << "char"; // -> "archar" cout << " "+strlen("char") << "char"; // -> "harchar" cout << " "+strlen("char") << "char"; // -> "charchar" cout << " "+strlen("char") << "char"; // -> "char" cout << " "+strlen("char") << "char"; // -> " char" cout << " "+strlen("char") << "char"; // -> " char"
Kann mir jemand das Verhalten erklären warum im obigen Beispiel immer nur 4 ausgegeben wird (beachtet kein weiterer "<<" Tranfer-Operator nach strlen()), und im unteren eine für mich verwirrende Ausgabe die im ostream entsteht, mit nachfolgendem Transfer-Operator.
PS: Ich war schon darauf und dran den operator+ für string dafür verantwortlich zu machen aber das kann ja nicht sein.
-
undefiniertes Verhalten ist undefiniert.
-
Nur
cout << " "+strlen("char") << "char"; // -> "char" cout << " "+strlen("char") << "char"; // -> " char" cout << " "+strlen("char") << "char"; // -> " char"
gehen. Das andere ist Popeln in Speicher, der Dir gar nicht gehört.
-
DeepCopy schrieb:
cout << " "+strlen("char") << "char"; // -> "char" cout << " "+strlen("char") << "char"; // -> " char" cout << " "+strlen("char") << "char"; // -> " char"
...
PS: Ich war schon darauf und dran den operator+ für string dafür verantwortlich zu machen aber das kann ja nicht sein.operator+ für std::string wird hier nie aufgerufen. Du bist hier in eine Falle getappt. Ein Zeichenliteral ist kein Objekt des Typs std::string, sondern ein lvalue vom Typ
const char[N]
wobei N jeweils die Länge des Strings + 1 ist (Nullterminierung). Dementsprechend sind die Addition Zeigerarithmetik. So kann man sich auch die Ausgabe von den 3 Zeilen erklären. Der andere Kram ist "Popeln im Speicher, der Dir gar nicht gehört".Selbst wenn Du
cout << std::string(" ") + strlen("char") << "char";
schreibst, kommst Du nicht an's Ziel (welches Ziel?). Es gibt kein operator+ der einen String (std::string) mit einer Zahl verknüpft. Wolltest Du das hier schreiben?
cout << " " << strlen("char") << "char"; cout << " " << strlen("char") << "char"; cout << " " << strlen("char") << "char";
Gruß,
SP
-
Mein Verständisproblem war:
cout << "1234" + sizeof("1234") << "1234"; // das gleiche ist wie char a[] "1234"; cout << a + 5 /* Nächste Adresse nach der letzten Speicherstelle von "1234\0" */ << "1234"; // ist
Und somit a und damit das erste "1234" völlig eliminiert wird, das eliminiert wurde war mir schon klar, nur bin ich halt über den + operator gestolpert und konnte das nicht nachvollziehen, und schönes C++ ist auch nicht, gebe ich ja zu, da wäre wohl die ios_base bzw. <iomanip> besser, meine C++ konformer gewesen, aber es soll ja auch nur für Testzwecke sein.
thx
-
Sebastian Pizer schrieb:
Wolltest Du das hier schreiben?
cout << " " << strlen("char") << "char"; cout << " " << strlen("char") << "char"; cout << " " << strlen("char") << "char";
Eher nicht.
Es ging um meinen hack im Makro in
http://www.c-plusplus.net/forum/viewtopic-var-t-is-249862-and-start-is-20.html