Informatik IIGrundlagen der Programmierung
Programmieren in C
Grundlagen C 2
Hochschule Fulda – FB ET
Sommersemester 2010
http://www.rz.hs-fulda.de/et
Peter Klingebiel, HS Fulda, DVZ
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 2
Anweisung / Ausdruck 1
• Programm setzt sich aus vielen Anweisungen (Zuweisungen, Vergleichen, Operationen, Funktionsaufrufen, usw.) zusammen
• Anweisung (statement) im strengen Sinn in C unbekannt
• Anweisung hat kein verwertbares Ergebnis• Beispiel: Zuweisung in Pascal, Ada, … integer i; i := 123;
• Variable i hat nach Zuweisung den Wert 123, die Zuweisung selbst ist allerdings nicht weiter auswertbar!
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 3
Anweisung / Ausdruck 2
• C kennt keine Anweisungen (statements), sondern nur Ausdrücke (expressions)
• Ausdruck hat einen Wert (wie in Assembler!)• Beispiel: Zuweisung in C int i; i = 4711;
• Zuweisung kann auch ausgewertet werden: int a, b, c, i, j; a = b = c = 3; if(i = 4711) ... while(j = 1) ...
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 4
Anweisung / Ausdruck 3
• Ausdruck Gültige Kombination vonKonstanten, Variablen, Operatoren, Funktionen
• Reihenfolge der Auswertung– Vorrangregeln der Operatoren legen Reihenfolge
der Auswertung implizit fest– Klammern ( ) legen Vorrangregeln explizit fest– Sind Vorrangregeln nicht eindeutig
Reihenfolge der Auswertung nicht definiert– Compiler kann Ausdrücke / Teilausdrücke in
effizient auswerten / optimieren
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 5
Datentyp short, int, long 1
• Ganze Zahlen• Typen short, int, long, long long• Speicherbedarf maschinenabhängig
– short <= int <= long <= long long– Heute z.B: short 16 Bit, int 32 Bit, long 64 Bit
• Vorzeichen– signed mit Vorzeichen– unsigned vorzeichenlos
• Konstanten, Beispiele:int a = 4711, b = -18; dezimalshort x = 0x20 sedezimal (Basis 16)int y = 020; oktal (Basis 8)
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 6
Datentyp short, int, long 2
• Syntaxdiagramm
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 7
Datentyp short, int, long 3
• Dezimal-, Sedezimal-, Binärdarstellung
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 8
Datentyp short, int, long 4
• Operatoren / Operationen:• Zuweisung =
– Beispiel: int i; i = 4711;
• Vorzeichen + -– Beispiel: int j = -4711;
• Arithm. Op. + - * / %– Beispiel: k = 2010 - i + j * 3 % 8;
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 9
Datentyp short, int, long 5
• Vergleichsoperatoren == != < > <= >=• expr1 op expr2
• Ergebnis: wahr 1, falsch 0• Ergebnistyp int
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 10
Datentyp short, int, long 6
• Logische Operatoren ! && ||
• Ergebnis: wahr 1, falsch 0 (Typ int)• expr1 op expr2
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 11
Datentyp short, int, long 7
• Bitoperatoren ~ & | ^
• expr1 op expr2 bzw. ~expr
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 12
Datentyp short, int, long 8
• Bitshiftoperatoren << >>• expr1 op expr2• Bits in expr1 um expr2 Bits verschoben
– Bsp. 1 << 2 1 um 2 Bits nach links – Bsp: n >> 5 n um 5 Bits nach rechts
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 13
Datentyp short, int, long 9
• Inkrement- / Dekrementoperatoren ++ --• Linkseitiger Operator ++n --n
– Wert von n wird inkrementiert / dekrementiert– das Resultat wird als Ergebnis geliefert
• Rechtsseitiger Operator n++ n--– Wert von n wird als Ergebnis geliefert– Danach wird n inkrementiert / dekrementiert
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 14
Datentyp char 1
• Einzelzeichen oder Integer 8 Bit• Speicherbedarf 1 Byte (8 Bit)• Konstanten, Zeichen durch ' ' geklammert
char c1 = 'A', c2 = '1', c3 = '\n'
• Sonderzeichen mit \ beschrieben, Bsp: '\n' Zeilentrenner (NL) '\t' Tabulator (TAB) '\0' Stringende (NUL) '\"' Anführungszeichen '\\' Backslash, Fluchtzeichen
• Darstellung im ASCII-Code char Untertyp von Ganzzahlen int
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 15
Datentyp char 2
• ASCII-Zeichensatz 7 Bit
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 16
Datentyp char 3
• ASCII-Zeichensatz 8 Bit (PC, MS-DOS)
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 17
Datentyp char 4
• ANSI-Zeichensatz 8 Bit (Windows)
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 18
Datentyp char 5
• Repräsentation (ASCII):
• Sinnvolle Operatoren/Operationen bei char:= (Zuweisung)+ - (arithm. Operationen)== != < > <= >= (Vergleich)
• Wird char als Byte (8 Bit-Integer) genutzt alle int-Operationen sinnvoll
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 19
Datentyp char 6
• Ascii-Tabelle ausgeben: ascii.c
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 20
Datentypen float, double, long double 1
• Fließkommazahlen• Typen float, double, long double• Speicherbedarf
– float < double < long double– float 32 Bit, double 64 Bit, long double 128 Bit
• Repräsentation nach IEEE 754– Beispiel: float 32 Bit
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 21
Datentypen float, double, long double 2
• Syntaxdiagramm
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 22
Datentypen float, double, long double 3
• Konstanten, Beispiele:float p = 3.141, a = -21.56, b = 0.54671.0 0.0 (Obacht: 1 oder 0 int)7.0e-3 (0.007) 7.6543e2(765.43)
• Operatoren / Operationen:= (Zuweisung)+ - (Vorzeichen)+ - * / (arithm. Op.)== != < > <= >= (Vergleich)
• Vorsicht bei Vergleichsoperationen wegen Ungenauigkeiten in Darstellung (z.B. bei 0.0)
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 23
Weitere Operatoren 1
• Spezielle Zuweisungsoperatoren verkürzte Schreibweise für Operationen auf Variablen
• a op= b a = a op b• Arithm. Operatoren: + - * / % • Bitoperatoren: << >> & | ^• Beispiele: int n = 12 n -= 24 n /= 3 n <<= 3
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 24
Weitere Operatoren 2
• Operator sizeof• Ermittelt Größe von Typ / Variablen in Bytes• Beispiel: long l; sl = sizeof(l) sd = sizeof(double)
• Beispiel: Sun Sparc 32 Bit
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 25
Weitere Operatoren 3
• Komma-Operator ,• Erlaubt die Aneinanderreihung mehrerer
Ausdrücke• Wert = Wert des letzen Teilausdrucks• Beispiel (etwas sinnlos):
• Beispiel (sinnvoller): for(i = 0, j = 0, k = 1; … )
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 26
Weitere Operatoren 4
• Bedingte Bewertung ? : expr1 ? expr 2 : expr3
• Verkürzte Formulierung von Bedingungen• Auswertung
– Erst Auswertung von expr1– Wenn expr1 ≠ 0 dann gesamter Ausdruck expr2– Sonst gesamter Ausdruck expr3
• Beispiel max(a, b) und min(a, b):
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 27
Vorrangregeln bei Operatoren
Operatorenklasse Operatoren Assoziativität
Unär ! ~ ++ -- + - Von rechts nach links
Multiplikativ * / % Von links nach rechts
Additiv + - Von links nach rechts
Shift << >> Von links nach rechts
Relational < <= > >= Von links nach rechts
Gleichheit == != Von links nach rechts
Bitweise & Von links nach rechts
Bitweise ^ Von links nach rechts
Bitweise | Von links nach rechts
Logisch && Von links nach rechts
Logisch || Von links nach rechts
Bedingte Bewertung ?: Von rechts nach links
Zuweisung = op= Von rechts nach links
Reihung , Von links nach rechts
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 28
Typumwandlung in Ausdrücken 1
• Automatische Typumwandlung bei unterschiedlicher Typen in Ausdrücken
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 29
Typumwandlung in Ausdrücken 2
• Beispiel:
• Explizite Typumwandlung (casting)(type) expr
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 30
Felder 1
• Ein Feld (array) ist die Zusammenfassung von Daten gleichen Typs in einer Variablen
• Felder haben eine oder auch mehrere Dimensionen (Vektoren, Matrizen, …)
• Definition von Feldern: char sbuf[128]; int arr[] = { 1, 8, 7, -1, 2 }; short mat[2][2] = { 11, 12, 21, 22};
• Mit der Felddefinition wird der benötigte Speicherplatz für die Variable reserviert
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 31
Felder 2
• Zugriff auf Feldelemente mit Index in []: char c; c = sbuf[32]; sbuf[0] = 'A';
• Die Feldindizierung beginnt immer mit 0! short s, mat[3][3]; s = mat[0][0];
• Felder werden elementweise und Zeile für Zeile hintereinander abgespeichert
• Es gibt beim Zugriff keinerlei Überprüfungen auf Bereichsgrenzen von Feldern!
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 32
Felder 3
• Feldnamen sind eigentlich Pointer, zeigen auf das erste Element im Feld
• Felder werden mit Adresse an Funktionen übergeben (wie Pointer)
• Feldindizes sind eigentlich Offsets und geben den Abstand zum Feldanfang anBsp: ia[3] *(&ia[0] + 3 * sizeof(int))
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 33
Felder und Zeiger
• Felder reservieren bei der Definition den benötigten Speicherplatz
• Zeiger erhalten den Speicherplatz erst bei der Zuweisung des Objekts, auf das sie zeigen, oder bei dynamischer Speicherallokation
• Ähnlichkeit von Feldern und Zeigern mächtige Pointerarithmetik möglich
• Manchmal ein wenig unverständlich!• Pointer essentiell bei Zeichenketten (strings)