Informatik II Grundlagen 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 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 2 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 3 Anweisung / Ausdruck 3 • Ausdruck Gültige Kombination von Konstanten, 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 4 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 – unsigned mit Vorzeichen vorzeichenlos • Konstanten, Beispiele: int a = 4711, b = -18; short x = 0x20 int y = 020; dezimal sedezimal (Basis 16) oktal (Basis 8) Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 5 Datentyp short, int, long 2 • Syntaxdiagramm Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 6 Datentyp short, int, long 3 • Dezimal-, Sedezimal-, Binärdarstellung Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 7 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 8 Datentyp short, int, long 5 • Vergleichsoperatoren == != < > <= >= • expr1 op expr2 int a = 3, b = 8, c = 5; a < 3 a >= b b != 5 a == 3 a != b b <= a + c • Ergebnis: wahr 1, falsch 0 • Ergebnistyp int Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 9 Datentyp short, int, long 6 • Logische Operatoren ! && || • Ergebnis: wahr 1, falsch 0 (Typ int) • expr1 op expr2 int a = 3, b = 8, c = 5; (a < b) && (c < b) (a == b) || (c >= a) Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 10 Datentyp short, int, long 7 • Bitoperatoren ~ & | ^ • expr1 op expr2 bzw. ~expr Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 11 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 12 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 int a = 8, b, c, d; b = ++a; c = a--; d = --a; Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 13 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' '\t' '\0' '\"' '\\' Zeilentrenner (NL) Tabulator (TAB) Stringende (NUL) Anführungszeichen Backslash, Fluchtzeichen • Darstellung im ASCII-Code char Untertyp von Ganzzahlen int Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 14 Datentyp char 2 • ASCII-Zeichensatz 7 Bit Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 15 Datentyp char 3 • ASCII-Zeichensatz 8 Bit (PC, MS-DOS) Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 16 Datentyp char 4 • ANSI-Zeichensatz 8 Bit (Windows) Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 17 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 18 Datentyp char 6 • Ascii-Tabelle ausgeben: ascii.c /* * * * */ ascii.c ASCII-Tabelle 7Bit und 8Bit auf std klin, 26.03.2010 #include <stdio.h> int main(void) { int c, w; Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 19 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 20 Datentypen float, double, long double 2 • Syntaxdiagramm Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 21 Datentypen float, double, long double 3 • Konstanten, Beispiele: float p = 3.141, a = -21.56, b = 0.5467 1.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 22 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 23 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 24 Weitere Operatoren 3 • Komma-Operator , • Erlaubt die Aneinanderreihung mehrerer Ausdrücke • Wert = Wert des letzen Teilausdrucks • Beispiel (etwas sinnlos): int a, b, c = 3; printf("%d\n", 1, b = 2, 3, c *= 4); printf("%d\n", (1, b = 2, 3, c *= 4)); • Beispiel (sinnvoller): for(i = 0, j = 0, k = 1; … ) Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 25 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): int a = 2, b = 4, min, max; max = (a > b) ? a : b; min = (a < b) ? a : b; Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 26 Vorrangregeln bei Operatoren Operatorenklasse Operatoren Assoziativität Unär ! ~ ++ Multiplikativ * / % Additiv + - Shift << Relational < Gleichheit == 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 = Reihung , -- + Von rechts nach links Von links nach rechts Von links nach rechts >> <= - Von links nach rechts > >= != op= Programmieren in C - Peter Klingebiel - HS Fulda - DVZ Von links nach rechts Von links nach rechts Von rechts nach links Von links nach rechts 27 Typumwandlung in Ausdrücken 1 • Automatische Typumwandlung bei unterschiedlicher Typen in Ausdrücken Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 28 Typumwandlung in Ausdrücken 2 • Beispiel: double d = 1.1, ed; float f = 1.1, ef; int i = 1, ei; char c = 1, ec; ec = (char) (d + f + i + c); ei = (int) (d + f + i + c); ef = (float) (d + f + i + c); ed = d + f + i + c; • Explizite Typumwandlung (casting) (type) expr Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 29 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 30 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 31 Felder 3 • Feldnamen sind eigentlich Pointer, zeigen auf das erste Element im Feld int i, *ip, ia[4] = {11, 22, 33, 44}; ip = ia; i = *++ip; • Felder werden mit Adresse an Funktionen übergeben (wie Pointer) • Feldindizes sind eigentlich Offsets und geben den Abstand zum Feldanfang an Bsp: ia[3] *(&ia[0] + 3 * sizeof(int)) Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 32 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) Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 33