Dies ist ein grundlegendes Merkmal von C89 und C ++ 98, das 'angrenzende Zeichenkettenverkettung' oder so genannt wird.
Wenn zwei Zeichenfolgenliterale ohne Interpunktion dazwischen liegen, werden sie zu einer einzigen Zeichenfolge zusammengefügt, wie Ihre Ausgabe zeigt.
In der C ++ 98-Norm sagt Abschnitt §2.1 'Phasen der Übersetzung [lex.phases]':
6 Benachbarte gewöhnliche String-Literaltoken werden verkettet. Benachbarte Wide-String-Literaltoken werden verkettet.
Dies ist, nachdem der Präprozessor abgeschlossen ist.
Im C99-Standard lautet der entsprechende Abschnitt in §5.1.2.1 "Übersetzungsphasen" und besagt:
6 Benachbarte String-Literaltoken werden verkettet.
Der Wortlaut wäre in jedem anderen C- oder C ++ - Standard sehr ähnlich, den Sie in die Hand nehmen können (und ich erkenne, dass sowohl C ++ 98 als auch C99 durch C ++ 11 und C11 ersetzt sind; ich habe es einfach nicht elektronische Kopien der endgültigen Normen, noch).
Es wird String-Verkettung genannt - wenn Sie zwei (oder mehr) in Anführungszeichen gesetzte Strings nebeneinander im Quellcode einfügen, zwischen denen nichts ist, fügt der Compiler sie in eine einzige Zeichenfolge zusammen. Dies wird meistens für lange Strings verwendet - alles mehr als eine Zeile lang:
%Vor%Bevor die Verkettung von Strings erfunden wurde, mussten Sie dies mit einer ziemlich unbeholfenen Zeilenfortsetzung tun, indem Sie am Ende jeder Zeile einen Backslash setzen (und sicherstellen, dass es das Ende war), weil die meisten Compiler es nicht als Zeilenfortsetzung behandeln würden wenn nach dem Backslash Leerzeichen vorhanden waren). Es gab auch Hässlichkeit damit, Einrückung zu werfen, weil irgendein Leerzeichen am Anfang der folgenden Linien in der Schnur enthalten sein könnte.
Dies kann zu einem kleineren Problem führen, wenn Sie ein Komma zwischen den Zeichenfolgen einfügen möchten, z. B. wenn Sie ein Array von Zeigern auf char initialisieren. Wenn Sie ein Komma verpassen, wird Sie der Compiler nicht warnen - Sie erhalten nur eine Zeichenfolge, die zwei separate enthält.
Ein Teil der C ++ - Standardimplementierung besagt, dass String-Literale, die nebeneinander liegen, miteinander verkettet werden.
Zitate aus C und C ++ Standard:
Für C (Zitat C99, aber C11 hat etwas ähnliches in 6.4.5p5):
(C99, 6.4.5p5) "In der Übersetzungsphase 6 das Multibyte-Zeichen Sequenzen, die durch eine beliebige Abfolge von benachbarten Zeichen und Gleich vorangestellte String-Literaltoken werden zu a verkettet einzelne Multibyte-Zeichenfolge. "
Für C ++:
(C ++ 11, 2.14.5p13) "In Übersetzungsphase 6 (2.2), benachbarter String Literale werden verkettet. "
ist dasselbe wie:
%Vor%Der Compiler verkettet die angrenzenden Teile von String-Literalen, wodurch ein größeres Stück String-Literal entsteht.
Als Nebenbemerkung ist const char*
(was in Ihrem Titel ist) nicht dasselbe wie char char[]
(was in Ihrem geposteten Code ist).
Benachbarte Zeichenfolgenliterale sind verkettet :
Wenn String-Literale angegeben werden, werden benachbarte Strings verkettet. Daher diese Erklärung:
char szStr []="12" "34"; ist identisch mit dieser Erklärung:
char szStr []="1234"; Diese Verkettung benachbarter Zeichenketten macht es einfach lange Strings über mehrere Zeilen hinweg zu spezifizieren:
cout & lt; & lt; "Vier Punkte und sieben Jahre" "Vor, unsere Vorfahren brachten hervor" "Auf diesem Kontinent eine neue Nation.";
Tags und Links c++