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


Anmelden zum Antworten