C++ für Dummies - Arnold Willemer - E-Book

C++ für Dummies E-Book

Arnold Willemer

0,0
17,99 €

-100%
Sammeln Sie Punkte in unserem Gutscheinprogramm und kaufen Sie E-Books und Hörbücher mit bis zu 100% Rabatt.
Mehr erfahren.
Beschreibung

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:

Android
iOS
von Legimi
zertifizierten E-Readern

Seitenzahl: 418

Bewertungen
0,0
0
0
0
0
0
Mehr Informationen
Mehr Informationen
Legimi prüft nicht, ob Rezensionen von Nutzern stammen, die den betreffenden Titel tatsächlich gekauft oder gelesen/gehört haben. Wir entfernen aber gefälschte Rezensionen.



C++ für Dummies

Schummelseite

PRIMITIVE VARIABLENTYPEN

int: Eine ganze Zahl.long: Eine ganze Zahl mit besonders hoher Kapazität.short: Eine zu kurz gekommene ganze Zahl.float: Eine kleine Fließkommazahl, inzwischen nicht mehr üblich.double: Dies verwendet man heute als Fließkommazahl.char: Ein Buchstabe, kann aber auch als Zahl betrachtet werden. Buchstabenliterale haben Hochkommata, wie etwa 'A'.bool: Wahrheitswert, enthält true oder false.void: Gibt es eigentlich gar nicht, wird aber bei Methoden verwendet, um zu kennzeichnen, dass sie nichts hergeben.

NICHTPRIMITIVE VARIABLEN

Arrays erkennen Sie an rechteckigen Klammern. Array-Indizes starten immer bei 0 und enden bei n–1, wenn das Array n Elemente hat. Ein Stern vor einem Variablennamen bei der Deklaration kennzeichnet einen Zeiger: Mit einem kaufmännischen Und (&) ermitteln Sie die Adresse einer Variablen, die Sie dann einem Zeiger zuweisen können. Mit einem Stern vor einer Variablen referenzieren Sie über den Zeiger. Eine Struktur kann mehrere andere Variablen zu einer Variablen zusammenfassen. Weitere Strukturvariablen können mithilfe des Strukturnamens angelegt werden. Auch Zeiger auf Strukturen sind möglich. Der Zugriff auf die Elemente geht über einen Punkt bei Variablen und ein Zeigersymbol bei Zeigern. Eine Struktur entspricht einer Klasse, die nur öffentliche Attribute hat.Eine Klasse nimmt neben Attributen auch Funktionen auf.

ABLAUFSTRUKTUREN

Abfrage: Falls der boolesche Ausdruck zutrifft, wird die Anweisung ausgeführt. Optional kann der Else-Zweig angehängt werden, um bei Nichtzutreffen aktiv zu werden. Schleife (while): Solange der boolesche Ausdruck zutrifft, wird der Block mit den Anweisungen wiederholt. Schleife (do-while): Diese Schleife prüft die Bedingung am Ende der Schleife ab, führt sie also mindestens einmal aus. Zählschleife (for): Die klassische for-Schleife hat einen Initialbereich, in dem meist eine Variable definiert und auf 0 gesetzt wird. Es folgt die Bedingung, unter der die Schleife durchgeführt wird. An dritter Stelle steht eine Anweisung, die nach dem Schleifenblock ausgeführt wird, typischerweise eine Inkrementierung der Zählvariable. For-Each-Schleife (for mit Doppelpunkt): In dieser Schleife wird vor dem Doppelpunkt eine Elementvariable definiert, die in jeder Runde vom nächsten Element des Containers hinter dem Doppelpunkt gefüllt wird. Funktion: Hier werden Anweisungen zusammengefasst. Die Parameterliste enthält Variablendefinitionen für die Werte, die als Parameter übergeben werden. Ist der Rückgabetyp nicht void, muss ein Wert dieses Typs mit dem Befehl return an den Aufrufer zurückgegeben werden.

TYPEN DER STL

vector: Dynamisch vergrößerbares Array. Auf seine Elemente kann über einen Index zugegriffen werden.deque: Vektor mit zwei Enden, ideal für Warteschlangen.list: Verkettete Liste, ideal beim Einfügen und Entfernen in der Mitte.set: Die Rache der Mengenlehre: Keine doppelten Elemente, immer schön geordnet.map: Assoziativer Speicher, auf den über einen Schlüssel zugegriffen wird. Die Datenbank des kleinen Mannes im Speicher.

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

Inhaltsverzeichnis

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

Tabellenverzeichnis

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

Illustrationsverzeichnis

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

Orientierungspunkte

Cover

Inhaltsverzeichnis

Fangen Sie an zu lesen

Seitenliste

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

Einleitung

Über dieses Buch

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.

Konventionen in diesem Buch

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.

Törichte Annahmen über den Leser

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.

Wie dieses Buch aufgebaut ist

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.

Symbole, die in diesem Buch verwendet werden

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.

Wie es weitergeht

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

Wir programmieren

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

Grundgerüst eines Programms

IN DIESEM KAPITEL

Das erste Programm und die Methode mainRaus und rein: Bildschirm und TastaturÜberraschung: Der Computer kann rechnen

Es 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.

Die Funktion main()

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.

Kommentare

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. */

Nicht verschachtelbar

/* 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!

Ausgabe für Anfänger

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.

Variante mit using namespace

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.

Zahlenspielereien

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.

Übungen

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

Variablen und Verarbeitung

IN DIESEM KAPITEL

Variablen als SpeicherTypen gibt's: Zahlen und ZeichenAusgaben tunen

Sie 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.

Variablendefinition

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.

Initialisierung

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.

Mehrfache Definition und Initialisierung

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:

Geltungsbereich

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.

Namensregeln

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.

Schlüsselwörter

Es dürfen keine Schlüsselwörter der Sprache C++ als Bezeichner verwendet werden.

Ganze Zahlen

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:

sizeof

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.

Wir rechnen

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«.

Das Reitschwein

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.

Kaskadierende Zuweisung

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.

Wertveränderungen

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.

Verkürzung

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

Inkrementieren

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.

Dekrementieren

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:

Überraschung!

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.

Übersicht

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

Ganzzahlige Literale

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.

Führende Null

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.

Zeichen

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.

Berechenbarkeit

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.

Kontrollzeichen

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.

Fließkommazahlen

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.

Fließkommaliterale

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.