Materialien zum Buch ... 31
Vorwort ... 33
1. Die Philosophie von C ... 41
1.1 ... Was ist C, und was ist es nicht? ... 41
1.2 ... Der C-Standard ... 44
1.3 ... Die Bedeutung von C heute ... 52
1.4 ... Rückblick und Ausblick ... 55
2. Werkzeugkette und das erste C-Programm ... 57
2.1 ... Minimales Beispiel main.c ... 57
2.2 ... Compiler im Alltag: GCC und Clang ... 60
2.3 ... C-Programm auf der Kommandozeile kompilieren und ausführen ... 68
2.4 ... Präprozessor, Compiler und Linker ... 73
2.5 ... Editoren, IDEs ... 74
2.6 ... Debugger und Laufzeitanalyse ... 80
2.7 ... Dokumentation zu C-Funktionen finden ... 82
2.8 ... Aufgabe ... 82
2.9 ... Rückblick und Ausblick ... 83
3. Syntax und Struktur von C-Programmen ... 85
3.1 ... Vom Quelltext zum Programm ... 85
3.2 ... Lexikalische Grundlagen ... 86
3.3 ... Lesbarkeit und Stil ... 90
3.4 ... Grammatik und Programmbausteine ... 91
3.5 ... Rückblick und Ausblick ... 93
4. Variablen, Datentypen und Typsicherheit ... 95
4.1 ... Konstanten und String-Literale: feste Angaben im Quelltext ... 95
4.2 ... Werte mit der Funktion zur formatierten Ausgabe printf() ausgeben ... 97
4.3 ... Grundtypen ... 99
4.4 ... Variablen ... 100
4.5 ... Konstante Werte ... 112
4.6 ... Ganzzahlen (int, short, long, long long) ... 117
4.7 ... Gleitkommatypen (float, double, long double) ... 120
4.8 ... Zeichentyp (char) ... 123
4.9 ... Wahrheitswerte (bool) ... 128
4.10 ... Der Nicht-Wertetyp (void) ... 129
4.11 ... Vorzeichenbehaftete und vorzeichenlose Ganzzahlen ... 130
4.12 ... Zahlendarstellungen und Schreibweisen ... 140
4.13 ... Typkategorien und Grundbegriffe ... 145
4.14 ... Rückblick und Ausblick ... 145
5. Operatoren und Ausdrücke ... 147
5.1 ... Primäre Ausdrücke ... 148
5.2 ... Zuweisungsoperatoren ... 149
5.3 ... Arithmetische Operatoren (+, -, *, /, %) ... 152
5.4 ... Kurzschreibweisen für Zuweisungen und Änderungen ... 157
5.5 ... Vergleichsoperatoren ... 160
5.6 ... Logische Operatoren (!, &&, ||) ... 165
5.7 ... Typumwandlungen (Conversions) und ihre Regeln ... 174
5.8 ... Kommaoperator, Vorrang, Assoziativität und Auswertungsreihenfolge ... 181
5.9 ... Mathematisches aus den Standard-Bibliotheken ... 186
5.10 ... Rückblick und Ausblick ... 188
6. Kontrollstrukturen ... 189
6.1 ... Bedingte Anweisungen (Fallunterscheidungen: if, else) ... 189
6.2 ... Bedingungsoperator (?:) ... 201
6.3 ... switch-Anweisung ... 205
6.4 ... while-Schleife ... 216
6.5 ... do-while-Schleife ... 222
6.6 ... for-Schleife ... 225
6.7 ... Schleifen mit break und continue steuern ... 231
6.8 ... Best Practices, Tipps und Fehlerquellen bei Schleifen ... 239
6.9 ... Programmsprünge (goto) ... 246
6.10 ... Rückblick und Ausblick ... 253
7. Funktionen ... 255
7.1 ... Warum Funktionen? ... 255
7.2 ... Funktionsgrundlagen: Definition, Deklaration und Aufruf ... 257
7.3 ... Parameterübergabe ... 263
7.4 ... Funktionen mit return verlassen ... 267
7.5 ... Funktionen mit Rückgabewerten ... 267
7.6 ... Überladen von Funktionen in C? ... 270
7.7 ... Rekursive Funktionen ... 272
7.8 ... Variadische Funktionen (variable Argumentlisten) ... 276
7.9 ... Inline-Funktionen ... 280
7.10 ... Attribute ... 282
7.11 ... Fehlerbehandlung in Funktionen ... 287
7.12 ... Rückblick und Ausblick ... 298
8. Scope, Linkage, Storage Duration und Modularisierung ... 299
8.1 ... Scope, Linkage und Storage Duration von Variablen und Funktionen ... 300
8.2 ... Storage Classes im Überblick ... 312
8.3 ... Header-Dateien und Modularisierung ... 321
8.4 ... Strukturierung größerer C-Anwendungen ... 344
8.5 ... Rückblick und Ausblick ... 347
9. Der C-Präprozessor ... 349
9.1 ... Historische Entwicklung und Motivation ... 349
9.2 ... Makros definieren: #define ... 356
9.3 ... Bedingte Kompilierung ... 388
9.4 ... Vordefinierte Makros ... 394
9.5 ... Compilerabhängige Erweiterungen ... 399
9.6 ... Rückblick und Ausblick ... 405
10. Benutzerdefinierte und erweiterte Datentypen ... 407
10.1 ... Typ-Alias definieren (typedef) ... 407
10.2 ... Ganzzahltypen aus ... 409
10.3 ... Typen aus ... 424
10.4 ... Optionale Gleitkomma-Datentypen ... 425
10.5 ... Größen, Grenzen und Eigenschaften der Typen ... 434
10.6 ... Rückblick und Ausblick ... 438
11. Komplexe Datentypen ... 439
11.1 ... Aufzählungen (enum) ... 439
11.2 ... Strukturen (struct) ... 457
11.3 ... Unions (union) ... 484
11.4 ... Rückblick und Ausblick ... 511
12. Arrays ... 513
12.1 ... Einführung und Motivation für Arrays ... 513
12.2 ... Deklaration von Arrays ... 513
12.3 ... Zugriff auf Array-Elemente ... 519
12.4 ... Initialisierung von Arrays ... 523
12.5 ... Arrays bei der Parameterübergabe und Rückgabe von Funktionen ... 540
12.6 ... Aufgaben ... 550
12.7 ... Mehrdimensionale Arrays ... 554
12.8 ... Einbinden externer Inhalte ... 576
12.9 ... Rückblick und Ausblick ... 578
13. Zeiger ... 579
13.1 ... Datenzeiger und Adressen ... 579
13.2 ... Der Null-Pointer nullptr ... 599
13.3 ... Zeiger und const: Unveränderlichkeit deklarieren ... 602
13.4 ... Zeiger in Funktionen ... 607
13.5 ... Void-Zeiger: typenloses Zeigerwerkzeug ... 620
13.6 ... Zeigerbeziehungen und -operationen ... 626
13.7 ... Array-Decay und Zeigerarithmetik ... 634
13.8 ... Zugriff auf Strukturen über Zeiger ... 652
13.9 ... Arrays von Zeigern ... 661
13.10 ... Mehrstufige Indirektion mit Zeigern auf Zeigern ... 671
13.11 ... Kommandozeilenargumente als Array von Zeigern ... 685
13.12 ... Funktionszeiger ... 688
13.13 ... Rückblick und Ausblick ... 718
14. Speicherverwaltung und Fehlersicherheit ... 721
14.1 ... Einführung in die dynamische Speicherverwaltung ... 721
14.2 ... Grundlegende Allokationsfunktionen und Anwendungen ... 723
14.3 ... Arbeiten mit Speicherbereichen ... 757
14.4 ... Flexible Array-Mitglieder (FAM) ... 771
14.5 ... Speicherlebenszyklen und Ownership-Modelle ... 773
14.6 ... Typische Speicherfehler und ihre Vermeidung ... 781
14.7 ... Fragmentierung und Out-of-Memory-Handling ... 804
14.8 ... Alignment und Padding ... 804
14.9 ... Debugging und Analyse von Speicherfehlern ... 807
14.10 ... Allokatoren ... 816
14.11 ... Rückblick und Ausblick ... 828
15. Metaprogrammierung ... 831
15.1 ... Das Problem: generischer Code ohne zusätzlichen Laufzeitaufwand ... 831
15.2 ... Präprozessor-Metaprogrammierung ... 833
15.3 ... Compilerbasierte Metaprogrammierung ... 837
15.4 ... Zusammenfassung und Ausblick ... 862
16. Zeichen, Zeichenketten und Textverarbeitung ... 865
16.1 ... Historische Grundlagen der Textrepräsentation ... 865
16.2 ... Von einzelnen Zeichen zu Zeichenketten ... 867
16.3 ... Moderne Textrepräsentation ... 874
16.4 ... Moderne Texttypen und Literale ... 877
16.5 ... Moderne String-Repräsentationen ... 884
16.6 ... Memory-Management-Techniken ... 889
16.7 ... Dynamische Strings ... 893
16.8 ... Locale: Einfluss auf Zeichen- und String-Funktionen ... 898
16.9 ... Formatierte Ausgabe in Strings ... 902
16.10 ... Parsing und Konvertierung ... 916
16.11 ... Klassische Charakterklassifikation (is*() und weitere) ... 926
16.12 ... Unicode in C23 ... 927
16.13 ... Standard-Stringfunktionen für nullterminierte Zeichenketten ... 931
16.14 ... Vergleiche und Hashing ... 944
16.15 ... Testing, Fuzzing und Verifikation von C-String-Code ... 951
16.16 ... Aufgabe ... 951
16.17 ... Rückblick und Ausblick ... 956
17. Ein-/Ausgabe (I/O) ... 957
17.1 ... Grundlagen von Streams ... 957
17.2 ... Dateien öffnen und schließen ... 958
17.3 ... Textdateien schreiben und lesen ... 960
17.4 ... Standardstreams ... 962
17.5 ... Rohdaten verarbeiten ... 964
17.6 ... Position im Stream steuern (fseek(), ftell() usw.) ... 972
17.7 ... Fehler erkennen und behandeln (ferror(), feof(), clearerr()) ... 975
17.8 ... Puffer und Streameigenschaften steuern ... 976
17.9 ... Dateien löschen und umbenennen ... 979
17.10 ... Temporäre Dateien ... 980
17.11 ... Plattform- und POSIX-Erweiterungen ... 982
17.12 ... POSIX-Erweiterungen rund um Datei- und Verzeichnis-I/O ... 983
17.13 ... Zusammenfassung und Ausblick ... 987
18. Bitoperationen ... 989
18.1 ... Bit- und Schiebeoperatoren ... 990
18.2 ... Bitmasken, Flags und typische Muster ... 996
18.3 ... Standardisierte Bitfunktionen () ... 1006
18.4 ... Ganzzahlen mit fester Bitbreite (_BitInt) ... 1008
18.5 ... Bitfelder ... 1012
18.6 ... Rückblick und Ausblick ... 1019
19. Numerik und Mathematik ... 1021
19.1 ... Sichere Arithmetik () ... 1021
19.2 ... Besondere Gleitkommazahlen ... 1025
19.3 ... Konvertierungen zwischen Ganz- und Gleitkommazahlen ... 1032
19.4 ... Mathematische Funktionen () ... 1036
19.5 ... Floating-Point-Umgebung und Rundungsmodi () ... 1040
19.6 ... Generische Mathematik () ... 1046
19.7 ... Zufallsfunktionen in C ... 1047
19.8 ... Komplexe Zahlen ... 1049
19.9 ... Rückblick und Ausblick ... 1051
20. Weitere Teile der C-Standardbibliothek ... 1053
20.1 ... Standard Utilities Header () ... 1053
20.2 ... Signale () ... 1058
20.3 ... Nichtlokale Sprünge () ... 1059
20.4 ... Zeit und Datum () ... 1067
20.5 ... Rückblick und Ausblick ... 1082
21. Nebenläufigkeit und Parallelität ... 1083
21.1 ... Einführung in Nebenläufigkeit ... 1083
21.2 ... Thread-Lebenszyklus: Erstellen, Ausführen, Beenden ... 1090
21.3 ... Das C-Memory-Modell und atomare Operationen ... 1106
21.4 ... Fortgeschrittene Konzepte kurz vorgestellt ... 1111
21.5 ... Alternativen zu ... 1112
21.6 ... Rückblick und Ausblick ... 1116
22. Standardbibliothek, Implementierungen und Erweiterungen ... 1119
22.1 ... Implementierungen der Standardbibliothek ... 1119
22.2 ... POSIX ... 1121
22.3 ... Plattformunabhängige Bibliotheken ... 1127
22.4 ... Plattformabstrahierende Bibliotheken ... 1128
22.5 ... Plattformspezifische APIs jenseits von C und POSIX ... 1130
22.6 ... Compiler- und Implementierungserweiterungen ... 1132
22.7 ... Zusammenfassung und Ausblick ... 1133
23. Build und Auslieferung ... 1135
23.1 ... Make ... 1136
23.2 ... Projektstruktur in C ... 1144
23.3 ... CMake ... 1147
23.4 ... Cross-Compiler ... 1149
23.5 ... Packaging und Distribution ... 1151
23.6 ... Continuous Integration ... 1152
23.7 ... Zusammenfassung und Ausblick ... 1154
24. Testen und Qualitätssicherung ... 1155
24.1 ... Compiler-Warnungen ... 1155
24.2 ... Statische Analyse ... 1156
24.3 ... Code-Formatter ... 1158
24.4 ... Tests ... 1159
24.5 ... Code-Coverage ... 1161
24.6 ... Fuzzing ... 1162
24.7 ... Review-Prozesse ... 1163
24.8 ... Dokumentation ... 1164
24.9 ... Zusammenfassung und Ausblick ... 1166
25. Profiler und Optimierung ... 1167
25.1 ... Compiler-Optimierungen ... 1167
25.2 ... Grundlagen und Kennzahlen der Leistungsanalyse ... 1172
25.3 ... Werkzeuge ... 1176
25.4 ... Benchmarking und Reproduzierbarkeit ... 1180
25.5 ... Optimierungstechniken im Code ... 1184
25.6 ... Methodik: systematisches Vorgehen bei Leistungsproblemen ... 1191
25.7 ... Rückblick und Ausblick ... 1193
26. Nachwort: der »C-Weg« -- Philosophie und Kernprinzipien ... 1195
Anhang ... 1199
A. Standard-Header ... 1201
B. Die 8 kostbaren Übersetzungsphasen ... 1205
C. Operatorpräzedenz ... 1211
D. Konvertierungsspezifikationen sowie PRI- und SCN-Makros ... 1213
Index ... 1229