Heim  >  Artikel  >  Backend-Entwicklung  >  Warum führt die Verkettung von String-Literalen und -Zeichen in C zu undefiniertem Verhalten?

Warum führt die Verkettung von String-Literalen und -Zeichen in C zu undefiniertem Verhalten?

DDD
DDDOriginal
2024-10-25 05:37:29190Durchsuche

Why Does Concatenating String Literals and Characters in C   Cause Undefined Behavior?

Verketten von Zeichenfolgen und Zeichen in C

Beim Verketten von Zeichenfolgen und Zeichen in C kann unerwartetes Verhalten auftreten. Um dies zu verstehen, schauen wir uns das Beispiel an:

<code class="cpp">string str = "ab" + 'c';
cout << str << endl;</code>

Hier wollen wir das Zeichen „c“ zur Zeichenfolge „ab“ hinzufügen. Das Ergebnis ist jedoch ein undefiniertes Verhalten, das zu einer scheinbar zufälligen Ausgabe führt.

Dieses Verhalten ist auf das Fehlen eines Standardoperators für Zeichenfolgenliterale („ab“) und Zeichenliterale („c“) zurückzuführen. Stattdessen interpretiert der Compiler „ab“ als Zeichenfolge im C-Stil und wandelt „c“ in einen int um. Das int wird dann zur Adresse des String-Literals hinzugefügt, was dazu führt, dass auf den Speicher außerhalb seiner Grenzen zugegriffen wird und unerwartete Zeichen ausgegeben werden, bis ein Nullzeichen gefunden wird.

Um dieses Problem zu vermeiden, können wir das String-Literal explizit in umwandeln eine Zeichenfolge:

<code class="cpp">string str = std::string("ab") + 'c';</code>

Alternativ können wir die Verkettung verwenden:

<code class="cpp">string str = "ab";
str += 'c';</code>

Im Gegensatz dazu funktioniert das zweite Beispiel, bei dem „ab“ eine bereits erstellte Zeichenfolge ist, wie erwartet:

<code class="cpp">char ch = 'c';
string str1 = "ab";
string str2 = str1 + ch;</code>

String-Klassen verfügen normalerweise über einen überladenen Operator, der die Verkettung intuitiv handhabt.

Das obige ist der detaillierte Inhalt vonWarum führt die Verkettung von String-Literalen und -Zeichen in C zu undefiniertem Verhalten?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn