Verketten von String-Literalen
In Accelerated C führt Koenig die Möglichkeit ein, Strings mithilfe des Operators „ “ zu verketten. Während dies mit einer Kombination aus Zeichenfolgen und Zeichenfolgenliteralen funktioniert, wirft es Fragen auf, wenn versucht wird, mehrere Zeichenfolgenliterale zu verketten.
Verstehen des Problems
Betrachten Sie das folgende Beispiel:
const string hello = "Hello"; const string message = hello + ",world" + "!";
Dieser Code wird trotz der Anwesenheit von „,world“ und „!“ erfolgreich ausgeführt. als String-Literale. Ein ähnlicher Versuch schlägt jedoch mit Folgendem fehl:
const string exclam = "!"; const string message = "Hello" + ",world" + exclam;
Der Assoziativitätsfaktor
Der Unterschied liegt in der Assoziativität des „ “-Operators. Die Auswertung erfolgt von links nach rechts, was bedeutet:
(hello + ",world") + "!"
Im ersten Fall wird „hello“ mit „,world“ verkettet, was zu einem String-Objekt führt. Dieses Objekt wird dann mit „!“ verkettet.
Im zweiten Fall können „Hello“ und „,world“ aufgrund der Einschränkung gegen die Verkettung zweier String-Literale nicht direkt verkettet werden. Dies führt zu einem Compilerfehler.
Mögliche Lösungen
Um das Problem zu beheben, kann man entweder sicherstellen, dass die ersten beiden Operanden für „ “ String-Objekte sind, oder das erzwingen Auswertungsreihenfolge mit Klammern:
Option 1: String-Objekt als erster Operand
const string message = string("Hello") + ",world" + exclam;
Option 2: Klammern
const string message = "Hello" + (",world" + exclam);
Warum String-Literale nicht direkt verkettet werden können
String-Literale sind Arrays von Zeichen und werden bei Verwendung in einem Ausdruck in Zeiger auf ihre Anfangselemente umgewandelt. Der Versuch, zwei String-Literale hinzuzufügen, entspricht dem Hinzufügen von zwei Zeigern, was ungültig ist.
Alternative zum Verketten von String-Literalen
String-Literale können durch einfaches Platzieren verkettet werden nebeneinander:
"Hello" ",world"
Dies ist äquivalent zu:
"Hello,world"
Dieser Ansatz funktioniert jedoch nur mit String-Literalen und nicht mit String-Objekten oder Zeichen-Arrays.
Das obige ist der detaillierte Inhalt vonWarum können String-Literale beim Verketten mit \' \' in C nicht direkt verknüpft werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!