Literale in C++
Ein Zeichenliteral ist ein Ausdruck für ein Zeichen. Zur Bildung seines Zeichenliterals wird das Zeichen direkt zwischen zwei Apostroph-Zeichen geschrieben.
- Das Zeichen „A“
A
- Das Literal für das Zeichen „A“
'A'
Dieses Beispiel zum Zeichen „A“ zeigt deutlich, daß man zwischen einem Zeichen und einem Zeichenliteral unterscheiden muß, da beide offensichtlich nicht übereinstimmen.
Das Zeichen eines Zeichenliterals kann ausgegeben werden, indem das Zeichenliteral in dem bisher behandelten Programm zur Ausgabe von „Hallo“ an die Stelle von »"Hallo!"« gesetzt wird.
hallo.cpp#include <iostream> // ::std::cout
#include <ostream> // << int main(){ ::std::cout << "Hallo!" << '\n'; }::std::coutHallo!
hallo.cpp#include <iostream> // ::std::cout
#include <ostream> // << int main(){ ::std::cout << 'A' << '\n'; }::std::coutA
Ein Zeichen wird in einem Quelltext also nicht direkt dargestellt, sonder nur mit Hilfe seines Zeichenliterals.
Übungsaufgabe
- / Zeichen ausgeben
- Schreiben Sie ein C++ -Programm, welches das Zeichen „B“ ausgibt.
- Hinweis: Die Aufgabe kann gelöst werden, indem das zuvor vorgestellte Programm etwas abgeändert wird.
Zeichenfolgenliterale in C++
Ein Zeichenliteral stellt immer genau ein Zeichen dar. Soll statt dessen eine Zeichenfolge durch einen Ausdruck dargestellt werden, so kann ein Zeichenfolgenliteral verwendet werden. In einfachen Fällen erhält man das Zeichenfolgenliteral aus der Zeichenfolge, indem man diese in Anführungszeichen einschließt.
- Die Zeichenfolge „A“
A
- Das Literal für die Zeichenfolge „A“
"A"
Dieses Beispiel zur Zeichenfolge „A“ zeigt deutlich, daß man zwischen einer Zeichenfolge und einem Zeichenfolgenliteral unterscheiden muß, da beide offensichtlich nicht übereinstimmen.
Außerdem sieht man, daß man zwischen einem Zeichenliteral und einem Zeichenfolgenliteral immer an Hand der verwendeten Anführungszeichen unterscheiden kann, auch wenn man zwischen dem Zeichen „A“ und der Zeichenfolge „A“ sonst nicht unterscheiden kann.
(Manche C++ -Implementationen melden es nicht als Fehler, wenn ein Zeichenliteral mehrere Zeichen enthält, da dies in manchen Implementation eine spezielle Bedeutung hat. Daher muß der Programmierer selber darauf achten, mit Zeichenliteralen nur ein Zeichen darzustellen.)
Das folgende Programmbeispiel zeigt die Verwendung eines Zeichenfolgenliterals in einem Programm.
hallo.cpp#include <iostream> // ::std::cout
#include <ostream> // << int main(){ ::std::cout << "A" << '\n'; }::std::coutA
Die Ausgabe dieses Programms mit dem Zeichenfolgenliteral »"A"« unterscheidet sich nicht von der Ausgabe des weiter oben vorgestellten Programms mit dem Zeichenliteral »'A'«. Tatsächlich ist es egal, welches der beiden Programm zur Ausgabe des Zeichens »A« verwendet wird. (Eventuell ist das Programm mit dem Zeichenliteral etwas schneller.) Ein Zeichenfolgenliteral muß aber immer dann verwendet werden, wenn ein Text mit mehr oder weniger als genau einem Zeichen als Ausdruck dargestellt werden soll, wie im folgenden Programm gezeigt.
hallo.cpp#include <iostream> // ::std::cout
#include <ostream> // << int main(){ ::std::cout << "Hallo!" << '\n'; }::std::coutHallo
Auch die leere Zeichenfolge kann durch ein Zeichenfolgenliteral dargestellt werden: Das folgende Programm gibt nur eine Leerzeile aus.
hallo.cpp#include <iostream> // ::std::cout
#include <ostream> // << int main(){ ::std::cout << "" << '\n'; }::std::cout
Die Quellzeichen des Zeichenfolgenliterals sind aber nicht immer mit den Zeichen der bezeichneten Zeichenfolge identisch.
Eine Darstellung eines Zeichens in einem Zeichenfolgenliteral kann nicht immer durch das dem Zeichen gleiche Quelltextzeichen erfolgen. Nicht alle Quelltextzeichen sind in einem Zeichenfolgenliteral erlaubt. So darf in einem Zeichenfolgenliteral etwa keine neue Zeile des Quelltextes begonnen werden.
Soll ein Zeilenendzeichen Teil einer Zeichenfolge sein, so ist es im Zeichenfolgenliteral durch den Quelltext »n« im „Steuerzustand“ (oder „Alternativzustand“) anzugeben. Im Steuerzustand kann jedes Zeichen eine „Steuerbedeutung“ oder „alternative Bedeutung“ haben. So bedeutet das Zeichen »n« in einem Zeichenfolgenliteral normalerweise einfach das Zeichen »n«, im Steuerzustand bedeutet es aber ein Zeilenende.
Dazu nimmt man an, daß man am Anfang eines Zeichenfolgenliterals in einem „Grundzustand“ („Normalzustand“) ist. Im Grundzustand steht das Zeichen »n« im Zeichenfolgenliteral für das Zeichen »n« in der Zeichenfolge. Wenn im Grundzustand jedoch der Rückstrich »\« auftritt, dann werden die nächsten direkt folgende Zeichen als Steuerzeichenfolge interpretiert. Solche Steuerzeichenfolgen haben eine andere Bedeutung als Zeichenfolgen im Grundzustand. Nach dem Ende einer solchen Steuerzeichenfolge gilt wieder der Grundzustand, ohne daß es eines besonderen Zurückschaltens bedarf. Als Steuerzeichenfolge steht »n« für ein Zeilenende und nicht mehr für den Buchstaben »n«.
- Zeichenfolgenliteral
"a\nb"
- Text
a
b
In dem obigen Beispiel schaltet der Rückstrich »\« in den Steuerzustand um. Das »n« wird dann als Steuerzeichenfolge, in diesem Fall also als Zeilenende, interpretiert. Danach gilt für die Interpretation des »b« stillschweigend wieder der Grundzustand.
Diese Regelung gilt auch für Zeichenliterale, was das »'\n'« erklärt, das bisher schon oft verwendet wurde. Es gibt ein einzelnes Zeichen, nämlich ein Zeilenende an, obwohl zwischen den Apostroph-Zeichen im Quelltext zwei Zeichen stehen. Daher entspricht es den Regeln für ein Zeichenliteral, die verlangen, daß nur genau ein Zeichen mit einem Zeichenliteral angegeben wird.
hallo.cpp#include <iostream> // ::std::cout
#include <ostream> // << int main(){ ::std::cout << "Hallo!" << '\n'; }::std::coutHallo
Soll ein Anführungszeichen »"« Teil der notierten Zeichenfolge sein, so ist es im Literal im Grundzustand durch den Quelltext »\"« (ein Rückstrich und ein Anführungszeichen) zu schreiben. Soll ein Rückstrich »\« in der Zeichenfolge notiert werden, so ist im Grundzustand der Quelltext »\\« (zwei Rückstriche) zu schreiben.
- Literal
"a\"b\\n"
- Zeichenfolge
a"b\n
Man beachte, daß in dem obigen Textliteral die Zeichenfolge "\n" nicht für ein Zeilenende steht, da der Rückstrich direkt vor dem Quelltext "n" darin nicht im Grundzustand auftaucht, sondern selber bereits als Steuerzeichen. Daher wäre es falsch, sich einfach zu merken, daß »\n« in einem Textliteral immer für ein Zeilenende steht. Um die Bedeutung eines Zeichens zu verstehen, muß man immer auch das Zeichen vor ihm berücksichtigen; das gilt auch für ein Rückstrich.
Mehrere direkt aufeinanderfolgende Zeichenfolgenliterale werden zu einer einzigen Zeichenfolge verbunden. Zwischen ihnen kann Leerraum stehen, also auch eine neue Zeile beginnen.
- Literale
"a" "b"
"c"- Zeichenfolge
abc
Umlaute, das Eszett und andere Sonderzeichen können in C++ zwar unter vielen Umgebungen verarbeitet werden, werden aber hier zunächst vermieden, weil ihre Verwendung etwas kompliziert sein kann.
Das folgende Beispielprogramm zeigt Zeichenfolgenliterale im Zusammenhang eines vollständigen Programmes.
- literal.cpp
#include <iostream>
#include <ostream> int main()
{ ::std::cout << "// /* Hau" "s Hof "
"Garten\nLauch\nAnfuehrungszeichen \"\nRueckstrich \\ */" << '\n'; }- ::std::cout
// /* Haus Hof Garten
Lauch
Anfuehrungszeichen "
Rueckstrich \ */
Die Zeichenpaare, welche sonst einen Kommentar einleiten würden, verlieren diese Sonderbedeutung, wenn sie in einem Textliteral vorkommen. Daher sind Kommentare innerhalb von Textliteralen nicht möglich.
Übungsaufgaben
- / Zeichenfolge ausgeben
- Schreiben Sie ein Programm, das die Zeichenfolge ausgibt, die unter der Überschrift "Text" steht, indem Sie diesen Text mit einem Textliteral notieren. Das Programm soll also eine Zeile mit 18 Zeichen (und nichts anderes) ausgeben.
- Text
"Hallo," sagte er.
- / Programm ausgeben (schwierig)
- Schreiben Sie ein C++ -Programm, das den Quelltext des Programms »literal.cpp« (fünf Zeilen) ausgibt.
Anhang *
Zeichen im Sonderzustand *
In dem Sonderzustand, in den ein einzelner Rückstrich »\« im Grundzustand umschaltet, haben die folgenden Zeichen Sonderbedeutungen.
- Tabelle
Z. Bedeutung Bed. deutschsprachige Bedeutung " double quote " Anfuehrungszeichen
' single quote ’ Apostroph
? question mark ? Fragezeichen
\ backslash \ Rueckstrich a alert BEL Alarm (Klangsignal, Glocke)
b backspace BS Rueckschritt (u.U. loeschend)
f form feed FF Formularvorschub
n new-line NL Neue Zeile
r carriage return CR Wagenrücklauf
t horizontal tab HT waagerechter Tabulator
v vertical tab VT senkrechter Tabulator
Im nächsten Abschnitt wird erklärt, warum auch für das Fragezeichen »?« eine Darstellung verfügbar ist.
Trigraphen *
Außerdem können im Quelltext einige Zeichen durch sogenannte Trigraphen dargestellt werden.
- Tabelle
Tri. Zeichen ??= #
??- ~ ??/ \
??' ^
??! | ??( [
??) ] ??< {
??> }
Damit kann ein Doppelkreuz »#« dann beispielsweise auch als »??=« geschrieben werden, falls es beispielsweise in einem Editor nicht zur Verfügung steht.
Um zu verhindern, daß beispielsweise »??=« als »#« interpretiert wird, wenn wirklich diese drei Zeichen gemeint sind, kann darin das zweite Fragezeichen als »\?« geschrieben werden, so daß »?\?=« für die drei Zeichen »??=« und nicht für das Doppelkreuz »#« steht.