String plus Char – was passiert?

Lesezeit: 2 Minuten

Benutzer-Avatar
fersarr

Ich bin nur neugierig, was passiert, wenn ich versuche, einem String ein Zeichen hinzuzufügen.

Anfangs dachte ich, es würde wie eine Verkettung funktionieren, aber das tat es nicht:

cout<<"ab"+'a'<<endl;
cout<<""+'a'<<endl;

Drucke

Geben Sie hier die Bildbeschreibung ein

Jedoch,

cout<<"bla"<<endl;
cout<<"ab"+'a'<<endl;
cout<<""+'a'<<endl;

Drucke

Geben Sie hier die Bildbeschreibung ein

  • Ich denke, das Problem ist, dass “ab” keine Zeichenfolge ist. Sieht so aus, als würden Sie Zeigerarithmetik für ein C-String-Literal durchführen.

    – David Heffernan

    7. März 2014 um 22:27 Uhr


Benutzer-Avatar
nur jemand

String-Literale sind char const[N] (zerfällt zu char const *), und char ist ein ganzzahliger Typ mit kleinem Bereich. Du machst Zeigerarithmetik.

Beachten Sie, dass der Speichertyp eines Strings in C und C++ ist char* oder char[]. Das heißt, ein String in C oder C++ ist nur ein Array von Zeichen (Zeiger und Arrays in C/C++ sind im Wesentlichen gleich).

Wenn Sie das tun "ab"+'a', “ab” wird zu einem Zeiger auf eine feste Zeichenfolge irgendwo im Speicher kompiliert, und ‘a’ wird zu der Ganzzahl seines ASCII-Werts (96) kompiliert. Das “ab” ist dann ein Zeiger auf die Position der Zeichenfolge im Speicher, und wenn Sie “ab” + ‘a’ ausführen, ist das Ergebnis ein Zeiger auf die Position 96 Bytes nach dem Beginn Ihrer Zeichenfolge. Das cout versucht dann, alle Daten zu drucken, die sich an dieser Stelle befinden, was in diesem Fall nicht druckbar ist.

Benutzer-Avatar
Daniel

Die Zeichenfolge wird in ein „char *“ konvertiert und dann wird der ASCII-Wert „a“ (96) zu diesem Zeichen hinzugefügt. Sie geben jetzt Zeichen über das Ende der Zeichenfolge hinaus aus.

Wenn Sie versuchen, zwei Zeichenfolgen zu verketten, lesen Sie Append Char To String in C? für weitere Informationen.

Sie drucken das arithmetische Ergebnis der Addition von Speicherwerten einer Zeichenfolge und eines Zeichens aus.

"ab" ist ein String-Literal des Typs const char [3] und es zerfällt zu einem const char* wegen Art Verfall wenn im Ausdruck verwendet "ab" + 'a'.

+ ist ein arithmetischer Operator und so die Zeichenliteral 'a' ist gefördert zu einem int.

Also im Wesentlichen tun Sie Zeigerarithmetik. Insbesondere fügen Sie die beförderten hinzu int Wert für die Verfallenen const char*. Seit std::ostream hat eine überlastung operator<<:

template< class Traits >
basic_ostream<char,Traits>& operator<<( basic_ostream<char,Traits>& os,  
                                        const char* s );

Es wird verwendet. Das heißt, das Argument für den benannten Parameter s wird das Ergebnis des Hinzufügens der beförderten sein int Wert für die Verfallenen const char*.

1018850cookie-checkString plus Char – was passiert?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy