17,99 €
Die Programmierung mit C++ muss nicht schwer sein. Mit diesem Buch werden Sie schon ab dem ersten Kapitel eigene Programme schreiben und die C++-Syntax von der Pike auf lernen, verstehen und anwenden. Arnold Willemer erklärt Ihnen, wie Sie Code zu Modulen zusammenfassen, die Sie immer wieder verwenden können, und schon bald werden Sie wissen, wie man Variablen deklariert und mathematische Operationen ausführt. So ist dies das richtige Buch für Ihren Einstieg in C++.
Sie lesen das E-Book in den Legimi-Apps auf:
Seitenzahl: 418
C++ für Dummies
Bibliografische Information der Deutschen Nationalbibliothek
Die Deutsche Nationalbibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie; detaillierte bibliografische Daten sind im Internet über http://dnb.d-nb.de abrufbar.
8. Auflage 2020© 2020 WILEY-VCH Verlag GmbH & Co. KGaA, Weinheim
All rights reserved including the right of reproduction in whole or in part in any form. This translation published by arrangement with John Wiley and Sons, Inc.
Alle Rechte vorbehalten inklusive des Rechtes auf Reproduktion im Ganzen oder in Teilen und in jeglicher Form. Diese Übersetzung wird mit Genehmigung von John Wiley and Sons, Inc. publiziert.
Wiley, the Wiley logo, Für Dummies, the Dummies Man logo, and related trademarks and trade dress are trademarks or registered trademarks of John Wiley & Sons, Inc. and/or its affiliates, in the United States and other countries. Used by permission.
Wiley, die Bezeichnung »Für Dummies«, das Dummies-Mann-Logo und darauf bezogene Gestaltungen sind Marken oder eingetragene Marken von John Wiley & Sons, Inc., USA, Deutschland und in anderen Ländern.
Das vorliegende Werk wurde sorgfältig erarbeitet. Dennoch übernehmen Autoren und Verlag für die Richtigkeit von Angaben, Hinweisen und Ratschlägen sowie eventuelle Druckfehler keine Haftung.
Coverfoto: dTosh – stock.adobe.comKorrektur: Claudia Lötschert
Print ISBN: 978-3-527-71747-7ePub ISBN: 978-3-527-82745-9
Cover
Einleitung
Über dieses Buch
Konventionen in diesem Buch
Törichte Annahmen über den Leser
Wie dieses Buch aufgebaut ist
Symbole, die in diesem Buch verwendet werden
Wie es weitergeht
Teil I: Wir programmieren
Kapitel 1: Grundgerüst eines Programms
Die Funktion main()
Kommentare
Ausgabe für Anfänger
Zahlenspielereien
Übungen
Kapitel 2: Variablen und Verarbeitung
Variablendefinition
Namensregeln
Ganze Zahlen
Zeichen
Fließkommazahlen
Symbolische Konstanten
Aufzählungstyp enum
Typen umtaufen
Fallstricke beim Umgang mit Typen
Automatische Typbestimmung
Zahlen ein- und ausgeben
Übungen
Kapitel 3: Abfrage und Wiederholung
Verzweigungen
Boolesche Ausdrücke
Immer diese Wiederholungen: Schleifen
Der Sprung als Feind der Struktur
Beispiel: Größter gemeinsamer Teiler
Mitmachbeispiel: Schleifende Hunde und Füchse
Übungen
Teil II: Datentypen und -strukturen
Kapitel 4: Das Array
Definition und Zugriff auf ein Array
Grenzen und Größen
Arrays lieben die for-Schleife
Lottozahlen sollten zufällig sein
Keine Doppelten beim Lotto
Sortierte Lottozahlen
Mehrere Dimensionen
Beispiel: Bermuda
Übungen
Kapitel 5: Zeiger und dessen Möglichkeiten
Der Zeiger und die Adresse
Arrays und Zeiger
Zeigerarithmetik
Konstante Zeiger
Der Zeiger auf gar nichts: void*
Übungen
Kapitel 6: Variablenverbund struct
Ein Verbund mehrerer Variablen
Arrays von Strukturen
Zeiger auf Strukturen
Beispiel: Bermuda
Objekte dynamisch erzeugen und löschen: new und delete
Zur Laufzeit erzeugte Arrays
Verkettete Listen
Teil III: Funktionen
Kapitel 7: Funktionen im Eigenbau
Anweisungen zusammenfassen
Funktionsparameter
Ein Rückgabewert als Ergebnis
Prototypen
Noch ein paar Bemerkungen zu Parametern
Überladen von Funktionen
Kurz und schnell: Inline-Funktionen
Kapitel 8: Hilfreiche Bibliotheksfunktionen
Zufall
Mathematische Funktionen
Zeitfunktionen
Kapitel 9: Einsatz von Funktionen
Vermeidung doppelten Codes
Top-down-Design am Beispiel Bermuda
Globale, lokale und statische Variablen
Rekursion: Selbstaufrufende Funktionen
Rückruf erwünscht: Der Funktionszeiger als Parameter
Anonym: Die Lambda-Funktion
Übungen
Teil IV: Zeichenketten
Kapitel 10: Die Standardklasse string
Zeichenkettenliterale
Definieren und Zuweisen
Zugriff auf einzelne Zeichen
String-Funktionen
Vergleiche
Ein- und Ausgabe von Strings
Umwandlung von string in ein char-Array
Kapitel 11: Das char-Array als Erbe von C
Speichern im Array
Der Zeiger auf char
Die String-Bibliothek
Teil V: Klassen
Kapitel 12: Am Beispiel zu Bruch gehen
Die Klasse Bruch
Der Bruch hat eigene Funktionen
Initialisierung durch Konstruktoren
Private Attribute
Operatoren überladen
Die Kopie von Zeigern in Klassen
Statische Variablen und Funktionen in Klassen
Konstante Parameter und Funktionen
Übungen
Hinweis
Kapitel 13: Vererbung
Basisklasse
Kompatibilität zur Basisklasse: »Ist ein«
Zugriff nur für Erben: protected
Zugriffsattribute der Vererbung
Konstruktorenvererbung
Kopierkonstruktor und Zuweisungsoperator
Mehrfachvererbung
Objektorientiertes Design für Bermuda
Übungen
Kapitel 14: Polymorphie und virtuelle Funktionen
Die Mensa der Universität Norgaardholz
Virtueller Destruktor
Polymorphie bei grafischen Oberflächen
Übungen
Teil VI: Fortgeschrittene Programmiertechniken
Kapitel 15: Große Programmprojekte
Aufteilung der Quelltexte
Header-Dateien und Schnittstellen
Bibliotheken
Namensräume
Kapitel 16: Katastrophenschutz: Fehler, Ausnahmen und Vorbedingungen
Die klassische Fehlerbehandlung
Ausnahmebehandlung
Vorbedingungen
Kapitel 17: Intelligente Sammelbehälter
Charakterlose Daten
Generische Programmierung
Die Container-Klasse vector
Die Container-Klasse deque
Die Container-Klasse list
Mengen-Container: set
Der assoziative Container map
Container-Adapter
Iteratortypen
Die Algorithmen der STL
Die Template-Klasse bitset
Teil VII: Dauerhaftes Ablegen von Daten
Kapitel 18: Ein- und Ausgabe in Dateien
Formatierte Ausgabe im Datenstrom
Dateioperationen mit fstream
Dateizugriffe nach ANSI-C
Kapitel 19: Datenbanken
Objektorientierter portabler Zugang: CppDB
Datenbankbibliothek SQLite
Teil VIII: Grafische Fensterprogramme GUI
Kapitel 20: Grafische Oberflächen
Kapitel 21: C-API am Beispiel Win32
Hauptprogramm
Die Fensterfunktion WndProc
Mausverhalten
Kontrollelemente
Bermuda in Win32
Kapitel 22: Objektorientiert mit wxWidgets
Installation von wxWidgets
Ein minimales xwWidgets-Programm
Grafik
Grafische Kontroll- und Eingabeelemente
Layout
Bermuda in der wxWidgets-Version
Kapitel 23: Qt
Geschichte eines portablen Frameworks
Installation
Ein Qt-Widgets-Projekt
Der Qt-Designer
Teil IX: Programmierumgebung
Kapitel 24: Compiler beschaffen und einrichten
Der GNU-C++-Compiler
Microsoft Visual Studio
Code::Blocks
Eclipse als C++-Umgebung
NetBeans
Kapitel 25: Programmierwerkzeuge
Der Compiler und der Linker
Der Präprozessor
Auf Fehlersuche mit dem Debugger
Versionsverwaltungen
Hinweis
Teil X: Der Top-Ten-Teil
Kapitel 26: 10 Gründe, warum Sie C++ einsetzen wollen
Sie wollen native Programme schreiben
Sie wollen sehr schlanke Programme schreiben
Das Programm soll schnell starten
Das Programm soll schnell laufen
Das Programm soll direkt an eine API ankoppeln
Sie wollen verhindern, dass jemand Ihren Source Code aus der ausführbaren Datei rekonstruiert
Sie müssen ganz dicht an die Maschine heran
Sie mögen keine ideologischen Vorschriften
Sie müssen sehr vertrackte Datenstrukturen auslesen
Sie lieben das Hashtag-Zeichen
Kapitel 27: Die 10 beliebtesten C++-Fehler
Sie benutzen beim n-dimensionalen Array n als Index
Ihre Schleife läuft ewig, weil Ihre Bedingung falsch formuliert ist
Ihre Schleife läuft ewig, weil sich die Variable, die für die Bedingung geprüft wird, im Schleifenkorpus nie ändert
Sie haben direkt hinter der Klammer von if/while/for ein Semikolon gesetzt
Sie haben vergessen, den #include zu setzen, und wundern sich, warum die Bezeichner unbekannt sind
Sie arbeiten mit deutschen Umlauten und verwenden kein unsigned char
Sie haben delete aufgerufen, aber den Zeiger anschließend nicht auf nullptr gesetzt
Sie verwenden häufiger new als delete
Ihre Klasse enthält ein Zeigerattribut, aber es fehlt der Copy-Konstruktor und der Zuweisungsoperator
Sie verwechseln es mit Java
Stichwortverzeichnis
End User License Agreement
Kapitel 2
Tabelle 2.1: Operatoren
Tabelle 2.2: Kurzschreibweisen
Tabelle 2.3: Mathematische Operatoren in aufsteigender Priorität
Tabelle 2.4: Beispiele unzulässiger ganzzahliger Literale
Tabelle 2.5: ASCII-Tabelle
Tabelle 2.6: Kontrollzeichen
Tabelle 2.7: Limit-Konstanten
Kapitel 3
Tabelle 3.1: Vergleich numerischer Werte
Tabelle 3.2: Wahrheitstabelle UND
Tabelle 3.3: Wahrheitstabelle ODER
Tabelle 3.4: Wahrheitstabelle NICHT
Tabelle 3.5: Wahrheitstabelle Entweder-oder
Kapitel 8
Tabelle 8.1: Trigonometrische Funktionen
Kapitel 10
Tabelle 10.1: Vergleichsoperatoren auf Strings
Kapitel 11
Tabelle 11.1: Flags
Kapitel 17
Tabelle 17.1: Iteratoren
Tabelle 17.2: Container und Iteratoren
Kapitel 18
Tabelle 18.1: Manipulatoren
Tabelle 18.2: Fließkommamanipulatoren
Kapitel 25
Tabelle 25.1: Standardmakros
Tabelle 25.2: Systemmakros
Kapitel 3
Abbildung 3.1: Eine Weiche stellt eine Verzweigung dar wie der Befe...
Abbildung 3.2: Einfaches Struktogramm
Abbildung 3.3: Verschachtelte if-Abfragen als Struktogramm
Abbildung 3.4: Zinsstaffel als Struktogramm
Abbildung 3.5: Eine Weiche führt zur Wiederholung.
Abbildung 3.6: Struktogramm der while-Schleife
Abbildung 3.7: Der Zug fährt erst an den Häusern vorbei und dann üb...
Abbildung 3.8: Struktogramm der do-while-Schleife
Abbildung 3.9: Struktogramm der for-Schleife
Abbildung 3.10: Struktogramm für den größten gemeinsamen Teiler
Kapitel 4
Abbildung 4.1: Lottozahlen in einem Array
Abbildung 4.2: Prinzip des Bubblesort
Abbildung 4.3: Struktogramm Bubblesort
Kapitel 5
Abbildung 5.1: Zeiger
Abbildung 5.2: Zeiger sind Array-kompatibel.
Abbildung 5.3: Array mit verschobenem Zeiger
Abbildung 5.4: Wandernder Zeiger
Kapitel 6
Abbildung 6.1: Verkettete Liste
Kapitel 7
Abbildung 7.1: Zeiger als Parameter
Abbildung 7.2: Der Parameter
argv
Kapitel 9
Abbildung 9.1: Struktogramm des Bermuda-Spiels
Abbildung 9.2: Türme von Hanoi
Kapitel 12
Abbildung 12.1: Kopieren von Objekten
Kapitel 13
Abbildung 13.1: Personenklassen
Kapitel 14
Abbildung 14.1: Ein nacktes
wxWidgets
-Programm
Kapitel 17
Abbildung 17.1: Deque
Kapitel 21
Abbildung 21.1: Das Spiel Bermuda als Win32-Applikation
Kapitel 22
Abbildung 22.1:
wxBoxSizer
Abbildung 22.2:
wxGridSizer
Abbildung 22.3:
wxFlexGridSizer
Abbildung 22.4: Das Spiel Bermuda unter wxWidgets
Kapitel 23
Abbildung 23.1: Der Qt Creator nach dem Start
Abbildung 23.2: Das BMI-Fenster wurde im Designer erstellt.
Abbildung 23.3: Das fertige BMI-Programm
Kapitel 24
Abbildung 24.1: Visual Studio nach dem ersten Start
Abbildung 24.2: Visual Studio nach dem ersten Start
Abbildung 24.3: Visual Studio mit dem ersten Projekt
Abbildung 24.4: Das Programm Code::Blocks
Cover
Inhaltsverzeichnis
Fangen Sie an zu lesen
1
2
3
5
6
21
22
23
24
25
26
27
28
29
30
31
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
109
110
111
112
113
114
115
116
117
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
189
190
191
192
193
194
195
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
249
250
251
252
253
254
255
256
257
258
259
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
451
452
453
457
458
459
460
461
462
Ich habe bereits ein paar Einsteigerbücher zu C++ geschrieben. Und davon wurden auch einige verkauft. Schauen Sie doch mal in Ihrem Bücherregal nach. Vielleicht waren Sie einer der Käufer.
Ich habe meine alten Manuskripte zugrunde gelegt, denn es war ja nicht alles schlecht. Und dann habe ich sie überarbeitet und noch einmal überarbeitet und ein weiteres Mal überarbeitet. Mein Lektor Marcel Ferner hat unglaubliche Geduld mit mir gehabt. Vielen Dank dafür.
Der Grund für die viele Arbeit war, dass ich wollte, dass das Buch möglichst leicht verständlich ist und möglichst auch etwas Spaß macht. Dafür ist es vielleicht nicht mehr so akademisch wertvoll. Aber was soll's. Ich kenne zufällig ein paar Akademiker und weiß, dass sie durchaus leicht verständliche Bücher schätzen.
Es gibt da diverse Schriftvariationen, die man verwenden kann, um ein paar Dinge hervorzuheben. Ich hatte hier folgende Ideen:
Neue Fachbegriffe
werden so, also kursiv hervorgehoben.
Oft haben Sie es mit
Dateien
oder
Pfaden
zu tun.
Manchmal finden Sie
www.informationen.de/im/internet
.
MENÜ- ODER BUTTONBESCHRIFTUNGEN
in grafischen Oberflächen werden auf diese Weise hervorgehoben.
Befehle
und
Schlüsselwörter
haben diese etwas langweilige Schrift.
Variablen, Funktionen und Klassen haben
Namen
. Diese Namen werden auch als
Bezeichner
bezeichnet. Das zeichnet sie aus.
Ich gehe nicht davon aus, dass Sie bereits irgendeine Programmiersprache beherrschen. Ich setze voraus, dass Sie wissen, was ein Computer ist, und dass Sie damit grundlegend umgehen können.
Das Buch wird Ihnen allerdings nur etwas nützen, wenn Sie selbst programmieren. Dazu habe ich ein paar Übungen ersonnen. Es ist wie beim Schnitzen, beim Malen, beim Singen oder Musizieren. Wenn Sie das Buch nur lesen, mögen Sie viel erfahren, wie es wäre, wenn man programmieren könnte. Aber lernen werden Sie es nur, indem Sie es selbst tun.
Sie finden bei einigen Listings hinter den Beschriftungen in Klammern einen Dateinamen, der darauf hinweist, dass es diese Listings als Quellcode zum Download gibt. Ich habe sie in einer ZIP-Datei gesammelt, die Sie aus dem Internet unter einer der folgenden URLs herunterladen können:
http://wiley-vch.de/ISBN9783527717477
http://www.willemer.de/cpp4dummies
Die Downloads sollen Ihnen das Tippen und die Suche der Tippfehler ersparen. Ich habe sogar Musterlösungen für die Übungen geschrieben, obwohl ich immer noch nicht sicher bin, ob das eine gute Idee war. Denn wenn Sie nicht selbst auf die Lösung kommen, bringt Sie die Musterlösung nicht viel weiter. Also meine Empfehlung ist: Vergessen Sie die Musterlösungen. Vielleicht habe ich sogar Fehler hineingebaut.
Hier sehen Sie im Überblick, was Sie in diesem Buch lernen können.
Teil I
: Wir steigen in die Programmierung ein. Das Ergebnis einfacher Berechnungen erscheint auf dem Bildschirm oder wird in Variablen geparkt. Das Programm fragt Bedingungen ab und wiederholt Abläufe.
Teil II
: Die einfachen Variablen werden zu Verbunden zusammengestellt. Ein Array ist eine beliebig lange Folge gleicher Elemente. Eine Struktur stellt aus beliebigen Elementen einen eigenen Datentyp her. Zeiger ermöglichen eine flexible Dynamik, die man allerdings auch beherrschen können muss.
Teil III
: Mehrere Anweisungen werden in Funktionen zusammengefasst. Sie bauen also eigene Befehle. Parameter und Rückgabewerte definieren den Datenfluss. Sie dienen aber auch zum Gliedern komplexer Aufgaben.
Teil IV
: Zeichenketten sind nur Folgen von Buchstaben? Nicht ganz! C++ kennt sogar zwei verschiedene Arten von Zeichenketten. Die Zeichenketten bringen einige Funktionen mit, um Texte zu verändern.
Teil V
: Mit den Klassen kommen wir zur objektorientierten Programmierung. Vererbung bedeutet bei Klassen nicht, dass der Erblasser stirbt. Was Polymorphie ist, werden Sie in der Mensa von Norgaardholz lernen.
Teil VI
: Wir betrachten Techniken, um größere Projekte in den Griff zu bekommen, von der Aufteilung der Quelltexte auf Dateien bis zu statischen und dynamischen Bibliotheken. Ein professionelles Programm kommt ohne Fehlerbehandlung nicht aus. Generische Container machen Datenhaltung effizient, ohne dass man sich um Details kümmert.
Teil VII
: Die Daten sollten auch dann noch existieren, wenn der Strom ausfällt oder das Programm endet. Dazu werden Dateien und Datenbanken eingesetzt.
Teil VIII
: Wir behandeln die Entwicklung von Programmen für grafische Oberflächen. C++ kann da sehr viele verschiedene Varianten spielen. Als Beispiel sehen Sie die klassische C-API von Windows. wxWidgets zeigt, wie die objektorientierte Programmierung vieles erleichtert und grafische Oberflächen portierbar werden. Moderne grafische Tools vereinfachen das Design von Oberflächen. Eine solche Entwicklung wird am Beispiel Qt gezeigt.
Teil IX
: Im diesem Kapitel werden die wichtigsten Programmierwerkzeuge vorgestellt, die Ihnen als Entwicklungsumgebung zur Verfügung stehen, und ich zeige Ihnen, wie Sie diese installieren. Der Umgang mit dem Debugger oder einer Versionsverwaltung kann für Programmierer langfristig überlebenswichtig sein.
Teil X
: Im zehnten Teil folgen die Top-10-Listen, wie sie in den meisten Dummies-Büchern Tradition sind.
Als ich dieses Buch schrieb, durfte ich mir ein paar Symbole aussuchen, die Sie nun immer wieder sehen werden. Sie müssen sie nicht auswendig lernen. Sie werden vermutlich schon am Inhalt merken, was sie bedeuten. Aber damit alles seine Ordnung hat, stelle ich Ihnen die Symbole kurz vor.
Neben diesem Symbol finden Sie oft das Konzentrat dieses Abschnitts, aber auf jeden Fall etwas, was Sie sich auf Ihren Spicker schreiben würden, wenn jemand Sie prüfen würde.
Ein Tipp lässt manche Arbeit etwas einfacher werden. Damit solche Hilfestellungen nicht verloren gehen, stehen sie neben diesem Symbol.
Wenn es da noch etwas zu erwähnen gibt, was zum Verständnis hilft oder sonst irgendwie wichtig ist, habe ich es neben dieses Symbol gestellt.
Bevor Sie mit einem Fehlgriff Daten zerstören, den PC schädigen oder die Welt pulverisieren, sollten Sie den Text neben diesem Symbol lesen. Die Welt oder Ihre Daten werden Ihnen dankbar sein.
Manchmal gibt es ungeheuer spannende Hintergründe zu einem Thema, das den Anfänger aufgrund der Komplexität etwas verschrecken könnte. Bevor der Informatiker in mir durchgeht, habe ich versucht, dieses Symbol zu verwenden. Sie können dem Ausflug folgen oder den Inhalt einfach ignorieren.
Die Formalitäten sind erledigt. Nun werden Sie Ihren Computer satteln und damit in die wunderbare Welt der Programmierung reiten. Dabei wird Ihr PC Dinge kennenlernen, die er nie zuvor gesehen hat.
Falls Sie dieses Buch richtig gut finden, senden Sie eine Mail an den Verlag, schreiben Sie eine Rezension für Amazon und informieren Sie das Fernsehen.
Falls das Buch nicht so toll finden, schicken Sie eine Mail an [email protected]. Ich werde sie lesen, und sobald ich die Schmach überwunden habe, dass ein Leser mich nicht verstanden hat, werde ich Ihnen antworten. Sie dürfen an diese Adresse aber selbstverständlich auch dann schreiben, wenn Sie an dem Buch Gefallen gefunden haben.
Norgaardholz
Arnold Willemer
Teil I
IN DIESEM TEIL…
Endlich tut der Computer, was wir wollen.Ein Programm hat ein Gedächtnis: Variablen.Wir machen Bewegungsübungen: Abzweigen und Wiederholen.Kapitel 1
IN DIESEM KAPITEL
Das erste Programm und die Methode mainRaus und rein: Bildschirm und TastaturÜberraschung: Der Computer kann rechnenEs spricht einiges dafür, dass Sie dieses Buch lesen, um zu lernen, wie Sie Ihren Computer in C++ programmieren können. So etwas geschieht in folgenden Schritten:
Sie werden Ihr Programm eintippen müssen.
Dabei werden Sie sich wohl oder übel an die
Syntax
halten müssen, die C++ vorgibt und dieses Buch beschreibt.
Leider versteht Ihr Computer die Programme so nicht. Der Computer mag wilde Zahlenfolgen, die Menschen nicht eintippen wollen. Ein
Compiler
übersetzt menschengeschriebene Programme in ausführbare Programmdateien für den Computer.
Sie starten die ausführbare Programmdatei und hoffen, dass das Programm das tut, was Sie dem Computer sagen wollten. Falls Sie unzufrieden sind, stimmt die
Semantik
nicht.
Sie werden einen Compiler brauchen. Davon gibt es jede Menge für alle möglichen Betriebssysteme. Ihr Chef wird Ihnen sicher gern auf Ihrem Arbeitsplatz einen Compiler zur Verfügung stellen. Sollten Sie keinen so fürsorglichen Chef haben, der sich so rührend um Sie kümmert, sollten Sie Kapitel 24 lesen. Ich warte hier solange auf Sie. Dann können wir anfangen.
Ein C++-Programm besteht mindestens aus der Funktion main. Keine Sorge, was eine Funktion ist, wird in Kapitel 7 genau erklärt. In jedem C++-Programm muss irgendwo der Name main mit einem Klammernpaar stehen, dem die Silbe int voransteht.
In manchen Fällen stehen zwischen den Klammern ein paar kryptisch anmutende Zeichen. Lassen Sie sich nicht verwirren. Was diese Zeichen zwischen den Klammern bewirken, werden Sie noch rechtzeitig erfahren.
Die Hauptfunktion beginnt direkt nach einer öffnenden geschweiften Klammer und endet mit der passenden schließenden Klammer. Was dazwischen steht, nennt man einen Block. In diesem Block zwischen den geschweiften Klammern stehen Anweisungen für den Computer. Sie werden nacheinander ausgeführt.
Wenn wir schon einmal ein Programm haben, das nichts tut, wollen wir es auch um Befehle erweitern, die nichts tun: Kommentare. Sie dienen zur Dokumentation des Programms. Unverständliche Programme werden zu Fehlern führen. Gute Kommentare helfen beim Verständnis.
Sie sehen, es gibt zwei Arten von Kommentaren.
// Der Kommentar gilt bis zum Ende der Zeile.
/* Alles dazwischen ist Kommentar. */
/* und */ umschließen einen Kommentar. Sie können die Kommentarklammern allerdings leider nicht verschachteln. Mit dem ersten Auftreten der Kombination /* beginnt der Kommentar. Er endet mit dem ersten Auftreten der Kombination */. Dazwischen liegende Kommentaranfangzeichen gehören zum Kommentar. Der Compiler wird den folgenden Text als Programm ansehen und versuchen, ihn zu übersetzen.
Die Kommentare sollen dokumentieren, warum das Programm so und nicht anders geschrieben wurde, und richten sich an Programmierer. Dies können Kollegen sein, die Ihr Programm korrigieren oder erweitern sollen. Aber noch öfter helfen Sie sich selbst damit. In der Praxis ist es so, dass Sie vermutlich auch herangezogen werden, wenn eines Ihrer Programme nicht korrekt läuft oder ergänzt werden soll. Da Sie zwischendurch andere Programme geschrieben haben werden, vielleicht geheiratet haben, umgezogen sind und noch drei weitere Programmiersprachen gelernt haben, werden Sie dankbar sein, wenn Sie in den Programmen ausführliche Hinweise finden, wie und warum es so funktioniert oder zumindest funktionieren soll.
Goldene Regel der Kommentierung: Kommentieren Sie nicht, was Sie gemacht haben, sondern warum Sie es so gemacht haben!
Das erste Fachbuch über C zeigte als erstes Programm eines, das »Hello World!« auf dem Bildschirm ausgab. Seither grüßen fast alle Programmierbücher erst einmal die Welt. Ich finde, dass Munkbrarup in den Fachbüchern dieser Welt zu kurz kommt.
In der ersten Zeile sehen Sie die Anweisung an den Compiler, die Datei iostream an dieser Stelle einzufügen. Solche #include-Anweisungen führen dazu, dass das Programm die Funktionen einer Bibliothek kennenlernt. Das Grußprogramm findet dort heraus, wer eigentlich std::cout ist.
Nachdem der Compiler nun weiß, wer std::cout ist, wollen Sie es vermutlich auch wissen.
cout
steht für »character out«. Es handelt sich um den Ausgang, zu dem die Zeichen auf den Bildschirm geschickt werden. Und damit sie den Weg auch sicher finden, weisen zwei Kleinerzeiichen dem Gruß an Munkbrarup den Weg.
std
ist ein Namensraum und besagt, dass
cout
unter dem Suchbegriff
std
zu finden ist.
::
ist der Trenner zwischen Namensraum und Bezeichner.
Am Ende der Zeile finden Sie mit std::endl noch das Zeilenendezeichen. Damit werden nachfolgende Ausgaben in die nächste Zeile geschickt.
Ansonsten sind die Anführungszeichen noch bemerkenswert. Sie umrahmen jedes Literal einer Zeichenkette. Damit weiß der Compiler, dass Hallo und Munkbrarup keine Befehle sind, sondern zu einem Text zusammengefasst werden sollen.
Die Symbole in iostream beginnen mit std::. Das bedeutet, dass sich cout und endl im Namensraum std befindet. Sie können sich das Eintippen von std:: sparen, wenn Sie mit der Anweisung using namespace den Namensraum std einbinden.
Sie können nun zwischen die Anführungszeichen (beinahe) beliebige Texte setzen. Aber noch interessanter ist es, Zahlen einzusetzen. Wenn Sie zwischen die Zahlen noch Operatoren wie das Plus- oder Minuszeichen setzen, kann Ihr Programm sogar rechnen.
Wenn Sie das Programm übersetzen und starten, wirft es die Zahl 2241 auf dem Bildschirm aus. Da es auf Tastaturen keinen mittigen Punkt gibt, behelfen sich die meisten Programmiersprachen mit einem Stern als Operator für die Multiplikation. Für die Division hat sich der Schrägstrich durchgesetzt. Auch die Klammern können Sie genau wie in der Mathematik üblich einsetzen.
Sogar Nachkommastellen sind möglich, sofern Sie damit zurechtkommen, dass das Komma ein Punkt ist.
So wie nur selbst essen fett macht, lernen Sie das Programmieren nur dadurch, dass Sie es selbst tun. Aus diesem Grund habe ich mir einige Aufgaben ausgedacht. Aber werden Sie kreativ und verwirklichen Sie auch eigene Programmideen!
Schreiben Sie
Listing 1.5
ab. Übersetzen und starten Sie es. In
Kapitel 24
ist beschrieben, wie Sie Ihre Arbeitsumgebung einrichten.
Schreiben Sie ein neues Programm, das die beiden Wörter »Hallo Benutzer« auf dem Bildschirm ausgibt.
Ändern Sie das Programm in
Listing 1.7
, indem Sie andere Zahlen, Operatoren und Klammern einsetzen. Überlegen Sie, was Ihre Änderung bewirken, und probieren Sie, ob Ihre Erwartungen erfüllt werden. Falls Sie eine Fehlermeldung des Compilers erhalten, lesen Sie die Meldung. Versuchen Sie, den Zusammenhang zwischen Ihrer Änderung und der Compiler-Meldung herzustellen.
Kapitel 2
IN DIESEM KAPITEL
Variablen als SpeicherTypen gibt's: Zahlen und ZeichenAusgaben tunenSie haben erfahren, dass Sie mit C++ rechnen können wie mit einem Taschenrechner. Ein guter Taschenrechner hat Speicherplätze, in denen Sie Zwischenergebnisse speichern können. C++ kennt so etwas auch, nennt es aber Variablen. Sie können im Gegensatz zum Taschenrechner beliebig viele davon anlegen. Damit Sie sie voneinander unterscheiden können, geben Sie ihnen Namen, die man auch Bezeichner nennt.
C++ unterscheidet Variablen für ganze Zahlen, Fließkommazahlen, Zeichen oder andere Datenarten. Diese Variablenart bezeichnet man als Typ. Variablen könnte man als Dreiklang aus Speicher, Name und Typ bezeichnen. Der Typ bestimmt den Speicherbedarf, aber auch die anwendbaren Operationen auf die Variable.
Das folgende Beispiel zeigt eine Variablendefinition innerhalb der Hauptfunktion main():
Eine Variablendefinition beginnt immer mit dem Typ der Variablen. Hier heißt der Typ int. Dieser Typ steht für eine ganze Zahl mit Vorzeichen, aber ohne Nachkommastellen (Integer). Durch ein Leerzeichen abgesetzt, beginnt der Name der Variablen. Zu guter Letzt folgt das Semikolon. Damit wird jede Anweisung abgeschlossen, auch eine Variablendefinition.
Wir können nun die Berechnung von Listing 1.7 in der Variablen ergebnis speichern. Das Ergebnis der Berechung wird einer Variablen zugewiesen, indem man ein Gleichheitszeichen zwischen der Variablen auf der linken und dem Rechenausdruck auf der rechten Seite stellt.
In einer Zuweisung wird zunächst der Ausdruck auf der rechten Seite des Gleichheitszeichens ausgewertet und dann der Variablen auf der linken Seite zugewiesen.
In der Ausgabezeile darunter wird die Variable ergebnis ausgegeben, da sie nicht durch Anführungszeichen eingeschlossen ist. Es erscheint also die Zahl 2241 auf dem Bildschirm.
Sie können und sollten Variablen gleich bei ihrer Definition mit einem Wert vorbelegen. Dazu setzen Sie hinter den Variablennamen ein Gleichheitszeichen. Das initialisiert die Variable mit dem nachfolgenden Wert.
Im Laufe seiner Geschichte hat C++ für die Initialisierung verschiedene Varianten gelernt.
int ergebnis=0;
int ergebnis(0);
int ergebnis{0};
int ergebnis={0};
Die Form, die einer Zuweisung ähnelt, ist weit verbreitet. Zunächst werden Sie damit gut zurechtkommen. Sie sollten aber darauf vorbereitet sein, dass Ihnen die anderen Formen der Initialisierung auch begegnen werden.
Es können mehrere Variablen gleichen Typs direkt hintereinander definiert werden, indem sie durch Kommata getrennt werden. Alle Variablen haben dann den gleichen Typ.
Hier werden die Variablen i, j und k als int-Variablen definiert. j wird mit 0 initialisiert. Diese Schreibweise ist mit der folgenden gleichwertig:
Sie können in C++ eine Variable erst verwenden, nachdem Sie sie deklariert haben, damit der Compiler prüfen kann, ob die Variable ihrem Typ gemäß verwendet wird.
Die Variable löst sich in Luft auf, wenn der Block verlassen wird, in dem die Variable definiert wurde. Sie erinnern sich, dass ein Block durch geschweifte Klammern definiert wird.
In C++ unterliegen alle Namen, die vom Programmierer gewählt werden können, den gleichen Regeln. Diese Regeln gelten nicht nur für Variablen, sondern auch für Funktionen oder Klassen. In der englischen Literatur werden diese Namen »identifier« genannt. Das wird meist mit »Bezeichner« übersetzt.
Ein Name muss mit einem Buchstaben oder einem Unterstrich beginnen.
Anschließend dürfen beliebig viele Buchstaben, Unterstriche und Ziffern folgen.
Die Buchstaben können klein oder groß sein. In C und C++ wird zwischen Groß- und Kleinschreibung unterschieden. Der Bezeichner Anton unterscheidet sich vom Bezeichner ANTON und dieser ist wiederum ein anderer Bezeichner als anton.
Die Buchstaben umfassen A bis Z und a bis z. Grundsätzlich ist die Verwendung nationaler Sonderzeichen in Namen nicht erlaubt. Umlaute oder ein ß im Variablennamen führen also immer zu einer Fehlermeldung.
Es dürfen keine Schlüsselwörter der Sprache C++ als Bezeichner verwendet werden.
Ganze Zahlen vermitteln ein ungebrochenes Vertrauen, vermutlich, weil wir sie bereits in frühester Kindheit kennengelernt haben. Im Englischen und insbesondere im Computer-Umfeld nennt man sie gern Integer. Der Typ einer Integer-Variablen heißt int. Um eine Variable vom Typ int zu definieren, wird zuerst der Typ int genannt. Es folgt zur Unterscheidbarkeit ein Leerraum und dann der Name der Variablen. Abgeschlossen wird die Definition durch ein Semikolon.
Es gibt verschiedene Geschmacksrichtungen des Integers. Um sie zu spezifizieren, stellen Sie einen Modifizierer vor den Typ int.
unsigned: Eine normale int-Variable kann einen negativen Wert enthalten. Wird davor das Schlüsselwort unsigned gestellt, kann der Wert nur positive Zahlen enthalten.
Auf diese Weise wird nicht nur verhindert, dass die Variable zaehler negativ wird. Der Zahlenbereich ins Positive wird verdoppelt.
short: Eine Variable vom Typ
short
belegt immer mindestens zwei Bytes. Eine Variable vom Typ
int
ist mindestens so groß wie ein
short
.
long: Eine Variable vom Typ
long
umfasst mindestens vier Bytes und ist mindestens so groß wie ein
int
.
long long: Seit C++11 kann sogar
long long
vorangestellt werden, wenn besonders große Zahlen benötigt werden.
Wie viele Bytes die verschiedenen Typen annehmen, ist bei C++ nicht festgelegt, sondern liegt im Ermessen des Compiler-Herstellers.
Wenn ein Modifizierer wie short oder unsigned verwendet wird, kann das Schlüsselwort int auch weggelassen werden. Damit sind auch folgende Definitionen zulässig und werden vom Compiler als attributierte Integer-Variablen verstanden:
Wenn Sie genau wissen wollen, wie viel Speicher ein Typ beziehungsweise eine Variablen von Ihrem Compiler bekommt, fragen Sie ihn doch einfach mit dem Ausdruck sizeof.
Wenn schon einmal Zahlen da sind, dann sollten wir damit auch rechnen. Für das Rechnen benutzt man Operatoren. So nennen Informatiker gern das Pluszeichen und seine Kollegen. Hier eine Übersicht.
Operator
Bedeutung
a + b
Addition
a – b
Subtraktion
a * b
Multiplikation
a / b
Ganzzahlige Division
a % b
Modulo: Rest einer ganzzahligen Division
Tabelle 2.1: Operatoren
Addition und Subtraktion dürften seit der Grundschule kein Problem darstellen.
Bei der Multiplikation verwenden Sie auch außerhalb der Weihnachtszeit einen Stern.
Dass die Punkt- vor der Strichrechnung geht, gilt auch bei C++. Falls das nicht zu Ihrer Rechnung passt, können Sie wie in der Mathematik ein Rudel Klammern einsetzen.
Die Division zweier ganzen Zahlen ergibt eine ganze Zahl. Also ergibt 1 geteilt durch 2 eben 0. Überrascht? Leider gibt es 0,5 nur bei Fließkommazahlen. Auf diesen miesen Trick fallen allerdings auch Profis noch hin und wieder rein.
Zum Ausgleich gibt es die Modulo-Rechnung. Sie liefert den Rest einer ganzzahligen Division. 1 modulo 2 ergibt nämlich 1. Erinnern Sie sich daran, wie Sie in den ersten Schulklassen dividiert haben! Damals fielen Sätze wie: »25 geteilt durch 7 ist 3, Rest 4«.
Schreiben wir ein Beispielprogramm! Sie wollen bei der nächsten Klima-Demo nicht gern mit Ihrem SUV auftauchen und leihen sich von einem Freund ein Reitschwein. Ihr Freund verrät Ihnen, dass das Reitschwein drei Möhren pro Kilometer frisst. Sie wissen, die Demo ist 17 Kilometer entfernt. Sie wollen aber auch wieder nach Hause, also müssen Sie 34 Kilometer reiten. Wie viele Möhren brauchen Sie?
Sie brauchen 108 Möhren. Die muss Ihnen Ihr Freund wohl mit dem SUV nachliefern.
C++ hat die Besonderheit, dass Sie in einer Anweisung mehreren Variablen den gleichen Wert zuweisen können. Sie müssen sich das so vorstellen, dass eine Zuweisung ihren Wert nach links durchreicht. Diese Fähigkeit ermöglicht eine Zeile wie die folgende:
Die Anweisung wird von der Datenquelle her abgearbeitet. 5 + 2 ergibt 7. Diese 7 wird der Variablen d zugewiesen. Das Ergebnis der Zuweisung ist eben dieser Wert 7, der dann c zugewiesen wird. Von dort geht es weiter zur Variablen b und schließlich zur Variablen a. Im Ergebnis enthalten alle aufgeführten Variablen den Wert 7.
Binäre Operatoren, also Rechensymbole, die zwei Ausdrücke miteinander verknüpfen, sind im Allgemeinen linksbindend. Das bedeutet, dass sie von links nach rechts ausgeführt werden, wenn die Priorität gleich ist. Das heißt, dass a * b / c als (a * b) / c ausgewertet wird. Eine Ausnahme ist die Zuweisung. Hier wird a = b = c als a = (b = c) ausgewertet. Der Zuweisungsoperator ist also rechtsbindend. Auch einstellige Operatoren sind rechtsbindend. Dazu gehört auch der Operator ++, den Sie im Laufe des Abschnitts noch kennenlernen werden.
Manchmal ergeben sich Werte aus ihrem bisherigen Wert. Beim Zählen addieren wir auf den bisherigen Wert jeweils eine Eins. Wir alle wünschen uns, dass der Chef unser Gehalt verdoppelt, aber weniger, dass die Miete wieder um 10 Prozent steigt.
Bei der Umsetzung in C++ nutzen wir aus, dass der Ausdruck rechts vom Zuweisungszeichen vor der Zuweisung ausgeführt wird.
Mathematikern bricht bei dieser Zeile das Herz. Sollten Sie auch dazu gehören, trösten Sie sich damit, dass ein einfaches Gleichheitszeichen in C++ eine Zuweisung ist und keineswegs die Gleichheit beider Seiten ausdrückt.
Die Zeile bedeutet: Der Wert der Variablen zaehler ergibt sich aus dem bisherigen Wert der Variablen zaehler, die vor der Zuweisung um 1 erhöht wird.
Es wird zuerst die rechte Seite des Zuweisungszeichens ausgewertet, bevor sie der Variablen auf der linken Seite zugewiesen wird. Insgesamt bewirkt die Zeile, dass sich der Inhalt der Variablen zaehler um 1 erhöht.
Es kommt häufiger vor, dass sich der neue Wert einer Variablen aus ihrem bisherigen Wert ergibt, der mit einem anderen Wert verrechnet wird. C++ erlaubt Ihnen, das kürzer zu formulieren, indem Sie den Operator vor das Zuweisungszeichen stellen. Damit wird angedeutet, dass die Variable mit sich selbst verrechnet wird. In der folgenden Zeile wird wiederum der Wert der Variablen zaehler um 1 erhöht:
Zwischen Plus- und Gleichheitszeichen darf kein Leerzeichen stehen. Die Bedeutung der Zeile ist also: »Addiere zur Variablen zaehler den Wert 1 hinzu.«
Der Gedanke liegt nahe, dass dies nicht nur für das Addieren funktioniert. Und tatsächlich können Sie diese Art der Verkürzung bei allen Grundrechenarten einsetzen.
Kurze Schreibweise
Lange Schreibweise
a += b
a = a + b
a –= b
a = a – b
a *= b
a = a * b
a /= b
a = a / b
a %= b
a = a % b
Tabelle 2.2: Kurzschreibweisen
In dem besonderen Fall, dass der Wert um 1 erhöht wird, kann der Ausdruck noch weiter verkürzt werden. Dazu werden an die Variable einfach zwei Pluszeichen angehängt.
Sie werden schon ahnen, dass dieses Doppelplus der Sprache C++ den Namen gegeben hat. C++ entspricht der Sprache C, die um 1 erhöht wurde.
Wie fast nicht anders zu erwarten, gibt es auch ein Doppelminus. Es tut genau das, was Sie schon vermuten: Es zieht von der Variablen den Wert 1 ab.
Warum es weder einen Doppelstern noch einen Doppelschrägstrich gibt, werde ich Ihnen nicht verraten. Betrachten Sie es als eines der letzten Geheimnisse unserer Erde.
Sie können sich selbst in Teufels Küche bringen, wenn das doppelte Plus oder Minus auf der rechten Seite einer Zuweisung anwenden.
Betrachten Sie das folgende Beispiel:
Klar ist, dass die Variable zaehler nach diesen Befehlen den Wert 6 enthält. Etwas unklarer ist dagegen, welchen Wert die Variable summe hat. Wenn Sie auf 7 tippen, liegen Sie richtig. Wie oben erwähnt, wird das Inkrementieren der Variablen zaehler erst nach der Auswertung durchgeführt. Sie können allerdings auch das Doppelplus vor die Variable stellen. Dann wird die Variable erst ausgewertet, nachdem sie inkrementiert worden ist.
In diesem Fall wird die Variable summe den Wert 8 haben. Besser ist es, solche Konstruktionen im Programm zu vermeiden. Schreiben Sie lieber ein paar Zeichen mehr und verteilen Sie die Anweisung auf zwei Zeilen. Die folgenden Zeilen bewirken das Gleiche und sind viel einfacher zu lesen:
Richtig fies ist die folgende Zeile:
Anschließend hat die Variable zaehler den gleichen Wert wie vor der Zeile. Durch das nachgestellte ++ wird die Erhöhung nach der Auswertung des Ausdrucks ermittelt. Die Erhöhung der Variablen zaehler wird zwar noch erhöht, aber anschließend durch die Zuweisung des Ausdrucks wieder überschrieben. Stellen Sie das ++ vor die Variable zaehler, wäre das Ergebnis um eins erhöht, wie Sie es vermutlich erwarten würden.
Operator
Bedeutung
Beispiel
+
Addition
a = 11 + 5; (16)
–
Subtraktion
a = 11 – 5; (6)
*
Multiplikation
a = 11 * 5; (55)
/
Division
a = 11 / 5; (2)
%
Modulo
a = 11 % 5 (1)
++
Inkrementieren
++a; oder a++;
--
Dekrementieren
--a; oder a--;
Tabelle 2.3: Mathematische Operatoren in aufsteigender Priorität
Literale sind Zahlenwerte, wie sie in einem Programm stehen, also etwa 5, –3, 17 oder 5498. Zahlenliterale bestehen nur aus Ziffern und enthalten weder Leerzeichen noch andere Sonderzeichen. Einer negativen Zahl wird das Minuszeichen vorangestellt. Bei positiven Zahlen ist das Pluszeichen erlaubt, aber nicht erforderlich.
Ein dezimales, ganzzahliges Literal ist 0 oder beginnt mit einer Ziffer ungleich 0. Ihr folgen beliebig viele weitere Ziffern einschließlich der 0.
Wie bereits erwähnt darf ein dezimales Zahlenliteral nicht mit einer 0 beginnen. Hinterlistigerweise wird sich der Compiler nicht beschweren. Stattdessen interpretiert der Compiler eine Zahl, die mit einer 0 beginnt, als ein Literal in einer nichtdezimalen Darstellung.
Neben den Dezimalzahlen gibt es in C++ auch die Möglichkeit, für Literale das oktale und das hexadezimale Zahlensystem zu verwenden.
Literal
Grund
1 234
Es befindet sich ein Leerzeichen zwischen 1 und 2.
1,234
Das Komma darf nie in einem Literal stehen.
1-
Das Vorzeichen muss vor der Zahl stehen.
12kg
Einheiten sind nicht erlaubt.
Tabelle 2.4: Beispiele unzulässiger ganzzahliger Literale
Binäre Zahlen beginnen mit 0b.
Der Standard C++14 hat binäre Literale eingeführt. Damit eine dezimale 10 von einer binären 10 unterscheidbar ist, wird 0b vorangestellt, also 0b10. Andere Ziffern als 0 und 1 gibt es naturbedingt nicht.
Hexadezimale Zahlen beginnen mit 0x.
Hexadezimale Zahlen verwenden nicht 10 Ziffern, sondern 16 Ziffern. Es werden die Ziffern 0 bis 9 verwendet und für die Stellen von 10 bis 15 die Buchstaben A bis F oder a bis f. Hexadezimalzahlen verwenden die Basis 16, 0x13 ist also eine dezimale 19.
Oktale Zahlen beginnen mit einer 0.
Es folgen Ziffern zwischen 0 und 7. Oktalzahlen verwenden die Basis 8. 013 ist also eine dezimale 11. Wenn Sie nicht gerade ein Oktopus sind, werden Sie für ein Zahlensystem auf der Basis 8 heutzutage vermutlich keinen Bedarf haben.
Jede ganzzahlige Konstante, die mit einer 0 beginnt, wird als nicht dezimale Konstante interpretiert. Vermeiden Sie also, einer Konstanten eine überflüssige 0 voranzustellen, sofern Sie nicht genau wissen, was Sie tun.
Eine Variable vom Datentyp char ist für Buchstaben und andere Zeichen vorgesehen. Dieser Datentyp ist genau ein Byte groß. Ein Byte kann 128 Zustände annehmen. Diese entsprechen den Zahlen von –128 bis 127. Ein unsigned char kann die Zahlen von 0 bis 127 aufnehmen. Zeichen werden codiert. Weniger hochtrabend ausgedrückt werden sie einfach durchnummeriert. Welche Zeichen auf welche Zahlen abgebildet werden, hängt vom Zeichensatz ab. Auf den meisten Systemen wird heute für die ersten 127 Zeichen ASCII (American Standard Code for Information Interchange) verwendet.
dez
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
hex
0
1
2
3
4
5
6
7
8
9
A
B
C
D
E
F
00
0
^A
^B
^C
^D
^E
^F
^G
^H
^I
^J
^K
^L
^M
^N
^O
16
10
^P
^Q
^R
^S
^T
^U
^V
^W
^X
^Y
^Z
32
20
!
"
#
$
%
&
'
(
)
*
+
,
-
.
/
48
30
0
1
2
3
4
5
6
7
8
9
:
;
<
>
?
64
40
@
A
B
C
D
E
F
G
H
I
J
K
L
M
N
O
80
50
P
Q
R
S
T
U
V
W
X
Y
Z
[
\
]
^
_
96
60
‘
a
b
c
d
e
f
g
h
i
j
k
l
m
n
o
112
70
p
q
r
s
t
u
v
w
x
y
z
{
|
}
~
Tabelle 2.5: ASCII-Tabelle
Die Kodierung der Zeichen können Sie aus Tabelle 2.5 ablesen. Der Buchstabe 'Z' hat die dezimale Nummer 80 + 10, also 90. Hexadezimal ist dies 0x50 + 0x0A, also 0x5A.
Die ersten zwei Zeilen werden für Kontrollzeichen verwendet. So wird die Tastatur auf die Kombination [Strg]+[C] den Code 3 liefern. Sie können damit Ausgabegeräte steuern. Beispielsweise hat das Zeilenendezeichen die Nummer 10.
Ab der Nummer 48 beginnen im ASCII-Zeichensatz die Ziffern. Das Zeichen '0' ist als 48 codiert.
Auch wenn fast alle Geräte heute ASCII verwenden, ist es sinnvoll, im Programm '0' statt 48 zu verwenden. Erstens versteht jeder sofort, dass es um die Ziffer 0 geht, und zweitens könnten Sie ja doch noch einmal auf ein Gerät mit dem EBCDIC-Zeichensatz stoßen.
Vorerst sollten Sie sich merken, dass die Zeichenliterale in Hochkommata gefasst werden und dass eine Ziffer als Zeichen nicht ihrem Wert als Zahl entspricht.
Da eine char-Variable ein Speicher für eine kleine ganze Zahl ist, stört es C++ nicht, wenn Sie einer Integer-Variablen einen Buchstaben zuweisen oder sogar damit rechnen. Das werden Sie immer wieder praktisch finden, wenn Sie aus einem Ziffernbuchstaben den Zahlenwert ermitteln müssen.
Natürlich geht das auch umgekehrt. Wenn Sie einen kleinen Zahlenwert haben, können Sie '0' hinzuaddieren, und Sie haben die Buchstabenziffer.
Da eine Variable vom Typ char eigentlich nur eine kleinere int-Variable ist, gibt es auch ein Vorzeichen. Wie bei int ist auch die char-Variable grundsätzlich vorzeichenbehaftet.
Dieses Vorzeichen wird sofort wichtig, wenn mit deutschen Umlauten oder sonstigen internationalen Zeichen hantiert wird. Achten Sie also darauf, dass Sie in solchen Fällen unsigned char verwenden.
Sie finden in C++ auch den Typ wchar_t. Dieser stammt noch aus der Zeit, in der man glaubte, durch Vergrößerung des char auf zwei Bytes die Probleme der internationalen Sonderzeichen in den Griff zu bekommen. Das wird vermutlich ein auslaufendes Modell, da der Zug wohl in Richtung UTF-8 geht. Ein Literal für den Typ wchar_t wird durch ein großes L vor dem ersten Hochkomma gekennzeichnet.
Um vom Zeichensatz der Maschine unabhängig zu sein, definiert C++ einige wichtige Sonderzeichen durch Voranstellen eines Backslashs (\). Der Backslash ähnelt dem Schrägstrich (/), den man auf einer deutschen Tastatur über der 7 findet, steht aber in der umgekehrten Richtung. Auf deutschen Tastaturen erzeugt man ihn durch die Kombination der Tasten [AltGr] und [ß]. Zum Backslash gehört immer mindestens ein Zeichen, das die Bedeutung der Sequenz codiert. Tabelle 2.6 zeigt die wichtigsten Sonderzeichen.
Sequenz
Bedeutung
∖n
Neue Zeile (line feed)
∖r
Zeilenrücklauf (carriage return)
∖t
Tabulatorzeichen
∖b
Backspace, also Zeichen rückwärts
∖f
Seitenvorschub
∖0
Echte 0, also nicht die Ziffer '0'
∖∖
Ausgabe eines Backslashs
Ausgabe eines Anführungszeichens
∖'
Ausgabe eines Hochkommas
Tabelle 2.6: Kontrollzeichen
Zeichenliterale können auch durch ihre Codierung erzeugt werden. Dazu wird die Zahl in oktaler (∖0nnn) oder hexadezimaler Darstellung (∖0xnn) hinter einen Backslash geschrieben. Problematisch ist die mangelnde Portabilität. Ein Umlaut unter Windows ist in der Regel nicht kompatibel zu denen auf dem Mac oder unter Linux, sodass unerwartete Zeichen entstehen.
Mit einem kleinen u (∖unnnn) wird eine hexadezimale Unicode-Codierung verwendet.
Ganze Zahlen sind für viele Zwecke sehr geeignet, aber das Leben fordert auch gebrochene Zahlen, auf die C++ mit den Fließkommatypen float, double und long double reagiert.
float
: Diese Variable belegt vier Bytes (32 Bit), kann Werte in dem Bereich von
aufnehmen. Und die Genauigkeit der Mantisse ist etwa auf sieben Stellen genau.
double
: Dieser Typ belegt doppelt so viel Speicher, also acht Bytes (64 Bit). Da die heutigen Rechner üblicherweise mit einer 64-Bit-Architektur arbeiten, ist es effizienter
double
zu verwenden, als mit
float
herumzugeizen. Dabei wird die Genauigkeit der Mantisse verdoppelt und die höchsten Zahlen überschreiten
.
long double
: Wenn es sehr genau sein muss, können Sie auch 16 Bytes verwenden, mit entsprechenden Steigerungen. Aber Sie werden gleich sehen, dass die wirklichen Probleme woanders liegen.
Beim Umgang mit Fließkommazahlen ergeben sich leicht Genauigkeitsprobleme. Das beruht nur zu einem Teil auf der begrenzten Zahl von Stellen der Mantisse.
Listing 2.17 zeigt das Problem auf. Die Zahl 0,3 wird schrittweise um 0,1 dekrementiert. Sie werden auf diese Weise aber den Wert 0,0 nicht exakt treffen. Der Grund ist, dass ein Zehntel in binärer Darstellung ebenso eine Periode darstellt wie ein Drittel in Dezimaldarstellung.
Bei long double wird als Ergebnis –2.77556e-17 ausgegeben, bei float 1.63913e-08, aber auf keinen Fall 0. Vorsicht also beim Akkumulieren von dezimalen Nachkommastellen. Hier hilft eine Rundung nach jeder Rechenoperation und vor jeder Ausgabe.
Das Literal einer Fließkommazahl hat folgendes Erscheinungsbild
Das Literal beginnt mit Zahlen.
Es folgt irgendwann das Kommazeichen als ein Punkt. Sorry, aber die Angelsachsen waren schneller. Und die verwenden einen Punkt als Dezimaltrennzeichen.
Nach dem Dezimalpunkt stehen die Nachkommastellen.
Wie bei einem Taschenrechner lassen sich auch Exponenten verwenden. Dabei wird als Basis stillschweigend 10 vereinbart. Um den Exponenten von der Mantisse zu trennen, wird ein großes oder kleines E verwendet.
Der Exponent selbst ist ein ganzzahliges Dezimalliteral, kann also auch negativ sein. 1e6 ist also eine Million. 1E-1 ist ein Zehntel.