Einführung in C/C++
Total Page:16
File Type:pdf, Size:1020Kb
Einführung in C/C++ Wulf Alex 2008 Karlsruhe Copyright 2000–2008 by Wulf Alex, Karlsruhe Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back- Cover Texts. A copy of the license is included in the section entitled GNU Free Documentation License on page 218. Ausgabedatum: 18. November 2008. Email: [email protected] Dies ist ein Skriptum. Es ist unvollständig und enthält Fehler. Geschützte Namen wie UNIX oder PostScript sind nicht gekennzeichnet. Geschrieben mit dem Texteditor vi, formatiert mit LATEX unter Debian GNU/Linux. Die Skripten liegen unter folgenden URLs zum Herunterladen bereit: http://www.alex-weingarten.de/skripten/ http://www.abklex.de/skripten/ Besuchen Sie auch die Seiten zu meinen Büchern: http://www.alex-weingarten.de/debian/ http://www.abklex.de/debian/ Von dem Skriptum gibt es neben der Normalausgabe eine Ausgabe in kleinerer Schrift (9 Punkte), in großer Schrift (14 Punkte) sowie eine Textausgabe für Leseprogramme (Screen- reader). There is an old system called UNIX, suspected by many to do nix, but in fact it does more than all systems before, and comprises astonishing uniques. Vorwort Die Skripten richten sich an Leser mit wenigen Vorkenntnissen in der Elektronischen Datenverarbeitung; sie sollen – wie FRITZ REUTERS Urgeschicht von Meckelnborg – ok för Schaulkinner tau bruken sin. Für die wissenschaftliche Welt zitiere ich aus dem Vorwort zu einem Buch des Mathematikers RICHARD COURANT: Das Buch wendet sich an einen weiten Kreis: an Schüler und Lehrer, an Anfänger und Gelehrte, an Philosophen und Ingenieure. Das Lernziel ist eine Vertrautheit mit Betriebssystemen der Gattung UNIX einschließlich Linux, der Programmiersprache C/C++ und dem weltumspannenden Internet, die so weit reicht, dass der Leser mit der Praxis beginnen und sich selbständig weiterbilden kann. Ausgelernt hat man nie. Zusammen bildeten die Skripten die Grundlage für das Buch UNIX. C und Internet, im Jahr 1999 in zweiter Auflage im Springer-Verlag erschienen (ISBN 3-540-65429-1). Das Buch ist vergriffen und wird auch nicht weiter gepflegt, da ich mich auf Debian GNU/Linux kon- zentriere. Meine Debian-Bücher (ISBN 3-540-43267-1 und 3-540-23786-0) sind ebenfalls bei Springer erschienen, aber nicht im Netz veröffentlicht. Die Skripten dagegen bleiben weiter- hin im Netz verfügbar und werden bei Gelegenheit immer wieder überarbeitet. Warum ein Linux/UNIX? Die Betriebssysteme der Gattung UNIX laufen auf einer Viel- zahl von Computertypen. Unter den verbreiteten Betriebssystemen sind sie die ältesten und ausgereift. Die UNIXe haben sich lange ohne kommerzielle Einflüsse entwickelt und tun das teilweise heute noch, siehe Linux, FreeBSD, NetBSD, OpenBSD und andere. Programmierer, nicht das Marketing, haben die Ziele gesetzt. Die UNIXe haben von Anfang an gemischte Hardware und die Zusammenarbeit mehrerer Benutzer unterstützt. In Verbindung mit dem X Window System, einem netzfähigen Fenstersystem, sind die UNIXe unter den Betriebssys- temen mittlerer Größe die leistungsfähigsten. Linux/UNIX-Rechner waren von Anbeginn im Internet dabei und haben seine Entwicklung bestimmt. Warum C/C++? Die universelle Programmiersprache C mit ihrer mächtigen Erweiterung C++ ist – im Vergleich zu BASIC etwa – ziemlich einheitlich. Der Anfang ist leicht, an die Grenzen stoßen wenige Benutzer. Das Zusammenspiel zwischen C/C++-Programmen und Li- nux/UNIX funktioniert reibungslos. Warum das Internet? Das Internet ist das größte Computernetz dieser Erde, ein Zu- sammenschluss vieler regionaler Netze. Ursprünglich auf Hochschulen und Behörden be- schränkt, sind mittlerweile auch Industrie, Handel und Privatpersonen beteiligt. Unser be- rufliches Leben und zunehmend unser privates Dasein werden vom Internet berührt. Eine Email-Anschrift ist so wichtig geworden wie ein Telefonanschluss. Als Informationsquelle ist das Netz unentbehrlich. Bei der Stoffauswahl habe ich mich von meiner Arbeit als Benutzer, Verwalter und Pro- grammierer leiten lassen. Besonderer Wert wird auf die Erläuterung der zahlreichen Fach- begriffe gelegt, die dem Anfänger das Leben erschweren. Die typische Frage, vor der auch ich immer wieder stehe, lautet: Was ist XYZ und wozu kann man es gebrauchen? Hinsichtlich vieler Einzelheiten verweise ich auf die Referenz-Handbücher zu den Rechenanlagen und Programmiersprachen oder auf Monografien, um den Text nicht über die Maßen aufzublä- hen; er ist ein Kompromiss aus Breite und Tiefe. Alles über UNIX, C und das Internet ist kein Buch, sondern ein Bücherschrank. An einigen Stellen gehe ich außer auf das Wie auch auf das Warum ein. Von Zeit zu Zeit sollte man den Blick weg von den Wellen auf das Meer richten, sonst erwirbt man nur kurzlebiges Wissen. Man kann den Gebrauch eines Betriebssystems, einer Programmiersprache oder der iii iv Netzdienste nicht allein aus Büchern erlernen – das ist wie beim Klavierspielen oder Ku- chenbacken. Die Beispiele und Übungen wurden auf einer Hewlett-Packard 9000/712 un- ter HP-UX 10.20 und einem PC der Marke Weingartener Katzenberg Auslese unter Debian GNU/Linux entwickelt. Als Shell wurden Bourne-Abkömmlinge bevorzugt, als Compiler wur- de neben dem von Hewlett-Packard der GNU gcc verwendet. Die vollständigen Quellen der Beispiele stehen im Netz. Dem Text liegen eigene Erfahrungen aus fünf Jahrzehnten zugrunde. Seine Wurzeln ge- hen zurück auf eine Erste Hilfe für Benutzer der Hewlett-Packard 9000 Modell 550 unter HP- UX, im Jahr 1986 aus zwanzig Aktenordnern destilliert, die die Maschine begleiteten. Ge- genwärtig verschiebt sich der Schwerpunkt in Richtung Debian GNU/Linux. Ich habe auch fremde Hilfe beansprucht und danke Kollegen in den Universitäten Karlsruhe und Lyon sowie Mitarbeitern der Firmen IBM und Hewlett-Packard für schriftliche Unterlagen und mündlichen Rat sowie zahlreichen Studenten für Anregungen und Diskussionen. Darüber hinaus habe ich fleißig das Internet angezapft und viele dort umlaufende Guides, Primers, HOWTOs, Tutorials und Sammlungen von Frequently Asked Questions (FAQs) verwendet. Weingarten (Baden), 15. Februar 2006 Wulf Alex Übersicht 1 Programmieren in C/C++ 2 A Zahlensysteme 180 B Zeichensätze 185 C UNIX-Systemaufrufe 196 D C-Lexikon 198 E Karlsruher Test 206 F GNU Lizenzen 214 G Zeittafel 225 H Zum Weiterlesen 234 v Inhalt 1 Programmieren in C/C++ 2 1.1 Grundbegriffe . .2 1.1.1 Wozu Programmierkenntnisse? . .2 1.1.2 Warum braucht man Programmiersprachen? . .2 1.1.3 Sprachenfamilien . .5 1.1.4 Imperative Programmiersprachen . .7 1.1.5 Objektorientierte Programmiersprachen . .9 1.1.6 Interpreter – Compiler – Linker . 11 1.1.7 Qualität und Stil . 12 1.1.8 Programmiertechnik . 13 1.1.9 Aufgabenanalyse und Entwurf . 14 1.1.9.1 Aufgabenstellung . 14 1.1.9.2 Zerlegen in Teilaufgaben . 15 1.1.9.3 Zusammensetzen aus Teilaufgaben . 16 1.1.10 Prototyping . 16 1.1.11 Flussdiagramme . 16 1.1.12 Memo Grundbegriffe . 18 1.1.13 Übung Grundbegriffe . 18 1.2 Programmer’s Workbench . 18 1.2.1 Nochmals die Editoren . 19 1.2.2 Compiler und Linker (cc, ccom, ld) . 19 1.2.3 Unentbehrlich (make) . 21 1.2.4 Debugger (xdb, gdb) . 23 1.2.5 Profiler (time, gprof) . 24 1.2.6 Archive, Bibliotheken (ar) . 25 1.2.7 Weitere Werkzeuge . 27 1.2.8 Versionsverwaltung mit RCS, SCCS und CVS . 28 1.2.9 Systemaufrufe . 34 1.2.9.1 Was sind Systemaufrufe? . 34 1.2.9.2 Beispiel Systemzeit (time) . 35 1.2.9.3 Beispiel Datei-Informationen (access, stat, open, close) . 37 1.2.9.4 Beispiel Prozesserzeugung (exec, fork) . 41 1.2.10 Begriffe Programmer’s Workbench . 41 1.2.11 Memo Programmer’s Workbench . 42 1.2.12 Übung Programmer’s Workbench . 43 1.2.13 Fragen Programmer’s Workbench . 45 1.3 Bausteine eines Quelltextes . 46 1.3.1 Übersicht . 46 1.3.2 Syntax-Diagramme . 46 1.3.3 Kommentar . 47 1.3.4 Namen . 48 1.3.5 Schlüsselwörter . 48 1.3.6 Operanden . 49 1.3.6.1 Konstanten und Variable . 49 1.3.6.2 Typen – Grundbegriffe . 50 1.3.6.3 Einfache Typen . 50 1.3.6.4 Zusammengesetzte Typen (Arrays, Strukturen) . 53 1.3.6.5 Union . 56 1.3.6.6 Aufzählungstypen . 56 vi INHALT vii 1.3.6.7 Pointer (Zeiger) . 56 1.3.6.8 Weitere Namen für Typen (typedef) . 61 1.3.6.9 Speicherklassen . 62 1.3.6.10 Geltungsbereich . 63 1.3.6.11 Lebensdauer . 64 1.3.7 Operationen . 64 1.3.7.1 Ausdrücke . 64 1.3.7.2 Zuweisung . 64 1.3.7.3 Arithmetische Operationen . 65 1.3.7.4 Logische Operationen . 66 1.3.7.5 Vergleiche . 67 1.3.7.6 Bitoperationen . 68 1.3.7.7 st ointeroperationen . 68 1.3.7.8 Ein- und Ausgabe-Operationen . 69 1.3.7.9 Sonstige Operationen . 71 1.3.7.10 Vorrang und Reihenfolge . 72 1.3.8 Anweisungen . 73 1.3.8.1 Leere Anweisung . 73 1.3.8.2 Zuweisung als Anweisung . 73 1.3.8.3 Kontrollanweisungen . 73 1.3.8.4 Rückgabewert . 78 1.3.9 Memo Bausteine . 80 1.3.10 Übung Bausteine . 81 1.4 Funktionen . 81 1.4.1 Aufbau und Deklaration . 81 1.4.2 Pointer auf Funktionen . 82 1.4.3 Parameterübergabe . 82 1.4.4 Kommandozeilenargumente, main() . 90 1.4.5 Funktionen mit wechselnder Argumentanzahl . 92 1.4.6 Iterativer Aufruf einer Funktion . 94 1.4.7 Rekursiver Aufruf einer Funktion . 96 1.4.8 Assemblerroutinen . 97 1.4.9 Memo Funktionen . 102 1.4.10 Übung Funktionen . 102 1.5 Funktions-Bibliotheken . 102 1.5.1 Zweck und Aufbau . 102 1.5.2 Standardbibliothek . 103 1.5.2.1 Übersicht . 103 1.5.2.2 Standard-C-Bibliothek . ..