Informatik II Grundlagen der Programmierung Programmieren in C Ausdrücke, Operatoren Hochschule Fulda – FB ET Sommersemester 2014 http://c-et.rz.hs-fulda.de Peter Klingebiel, HS Fulda, DVZ
Wiederholung 1 Definition von Variablen (und Konstanten und Funktionen) Festlegung von Datentyp Namen / Identifier Speicherplatz Lebensdauer und Scope Deklaration von Variablen (und Konstanten und Funktionen) Festlegung von Parametertypen bei Funktionen Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Wiederholung 2 Typwandlung implizit Beispiel: int * float float * float explizit durch Typecast (type) variable Beispiel: (float) int * float Beispiel ... int a = 10, b = 4, c = 8, d = 1; float x = 2.5, y; ... y = a / x + b / c + d; // Ergebnis? ... Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 3
Wiederholung 3 Sichtbarkeit von Variablen (und Konstanten) abhängig vom Ort der Definition in Block {} Block ausserhalb Block global im Programm ausserhalb Block static im Modul (Quelltext) Lebensdauer von Variablen (und Konstanten) abhängig von der Speicherklasse in Block {} Blocklebensdauer in Block static Programmlebensdauer ausserhalb Block Programmlebensdauer Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 4
Wahl von Datentypen 1 Aufgabenstellung bestimmt Typen der Daten Zahlen in Mathematik und Wissenschaft double reicht meist aus float i.d.R. zu ungenau long double in Spezialfällen Anzahlen oder Ganze Zahlen int reicht oft aus unsigned mit doppeltem Wertebereich Geldbeträge? Komplexere Daten? Z.B. Adressen Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 5
Wahl von Datentypen 2 Beispiel: Fakultätsfunktion n! mit Datentyp unsigned long (0 bis 4.294.967.295) 1! = 1 2! = 2 * 1! = 2 3! = 3 * 2! = 6 4! = 4 * 3! = 24 5! = 5 * 4! = 120 6! = 6 * 5! = 720 7! = 7 * 6! = 5040 8! = 8 * 7! = 40320 9! = 9 * 8! = 362880 10! = 10 * 9! = 3628800 11! = 11 * 10! = 39916800 12! = 12 * 11! = 479001600 13! = 13 * 12! = 1932053504 falsch! 14! = 14 * 13! = 1278945280 falsch! Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 6
Anweisung / Ausdruck 1 Programm setzt sich aus vielen Anweisungen (Zuweisungen, Vergleichen, Operationen, Funktionsaufrufen, usw.) zusammen Anweisung (statement) im strengen Sinn ist in C unbekannt Anweisung hat kein auswertbares 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
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; // wird nicht ausgewertet Zuweisung kann auch ausgewertet werden: int a, b, c, i, j; a = b = c = 3; // c = 3; b = c; a = b; if(i = 4711); ... while(j = 1) ... Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Anweisung / Ausdruck 3 Ausdruck Gültige Kombination von Konstanten, Variablen, Operatoren Funktionsaufrufen 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 effizient auswerten / optimieren Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Operatoren 1 Szene aus: Is' was, Doc? (1972) - youtube Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Operatoren 2 Was können wir mit Daten/Werten machen? Speichern, Zuweisen, Auslesen, … Verknüpfen Verändern In C mit Operatoren Operator liefert neuen Wert Operator operiert auf Operanden Operatoren aus der Mathematik gut bekannt z.B. die Operatoren + - * / C bietet aber sehr viel mehr Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 11
Operatoren 3 Zahl der Operanden Position des Operators unär - ein Operand, Bsp.: 4711 oder -3456 binär - zwei Operanden, Bsp.: 4711 + 3456 ternär - drei Operanden Position des Operators Infix - steht zwischen den Operanden Präfix - steht vor den Operanden Postfix - steht nach den Operanden Linksassoziativität / Rechtsassoziativität Bsp.: x + y + z = (x + y) + z Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 12
Vorrangregeln bei Operatoren Operatorenklasse Operatoren Assoziativität Unär ! ~ ++ -- + - Von rechts nach links Multiplikativ * / % Von links nach rechts Additiv + - Shift << >> Relational < <= > >= Gleichheit == != Bitweise & ^ | Logisch && || Bedingte Bewertung ?: Zuweisung = op= Reihung , Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Ganzzahloperatoren 1 Bekannt: Ganze Zahlen, Integerzahlen Typen short, int, long, long long Speicherbedarf maschinenabhängig short <= int <= long <= long long Heute: short 16 Bit, int / long 32 Bit, long long 64 Bit Vorzeichen signed mit Vorzeichen unsigned vorzeichenlos Konstanten, Beispiele: int a = 4711, b = -18; dezimal short x = 0x20 sedezimal (Basis 16) int y = 020; oktal (Basis 8) Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Ganzzahloperatoren 2 Dezimal-, Sedezimal-, Binärdarstellung Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Ganzzahloperatoren 3 binprt.c – Integer dez / hex / binär ausgeben Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Ganzzahloperatoren 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
Ganzzahloperatoren 5 Vergleichsoperatoren == != < > <= >= expr1 op expr2 Ergebnis: wahr 1, falsch 0 Ergebnistyp int Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Logische Operatoren ! && || Ganzzahloperatoren 6 Logische Operatoren ! && || Ergebnis: wahr 1, falsch 0 (Typ int) expr1 op expr2 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Ganzzahloperatoren 7 Bitoperatoren ~ & | ^ expr1 op expr2 bzw. ~expr Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Ganzzahloperatoren 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
Ganzzahloperatoren 9 bitops.c - Bitoperationen Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Ganzzahloperatoren 10 bitshift.c – Bitshift links und rechts Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Ganzzahloperatoren 11 Inkrement- / Dekrementoperatoren ++ -- Linkseitiger Operator ++n --n n wird erst inkrementiert / dekrementiert das Resultat wird danach als Ergebnis geliefert Rechtsseitiger Operator n++ n-- n wird erst als Ergebnis geliefert n wird danach inkrementiert / dekrementiert Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Zeichenoperatoren 1 Bekannt: Einzelzeichen 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
Zeichenoperatoren 2 ASCII-Zeichensatz 7 Bit Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Zeichenoperatoren 3 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
Zeichenoperatoren 4 ascii.c – ASCII-Tabelle ausgeben Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Zeichenoperatoren 5 „Zeichenarithmetik“ Was bedeutet: n = '2' - '0'; // ? Jedes Zeichen hat einen Wert, der dem Index des Zeichens in der ASCII-Tabelle entspricht '0' 4810 und '2' 5010 n = '2' - '0' = 50 – 48; // = 2 Beispiel: int c, n; printf( Ziffer 0 .. 9 eingeben: ); c = getchar(); n = c - '0'; // n = Dezimalwert von c Programmieren in C - Peter Klingebiel - HS Fulda - DVZ
Fließkommaoperatoren 1 Bekannt: 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
Fließkommaoperatoren 2 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
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
Weitere Operatoren 2 Operator sizeof Liefert Größe von Typen / 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
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
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
Beispiel: EA-Simulation 1 Microcontroller mit E/A-Geräten, z.B. Sensoren Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 36
Beispiel: EA-Simulation 2 Schematischer Aufbau eines Embedded System Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 37
Beispiel: EA-Simulation 3 Modell EA-Register für EA-Simulation Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 38
Beispiel: EA-Simulation 4 Modellierung der EA-Register in C typedef unsigned char byte; static byte eac; // EA-Control static byte ead1; // EA-Data 1 static byte ead2; // EA-Data 2 Status-/Programmierbits als CPP-Makros #define EAC_R 0x01 // Data Ready: 00000001 #define EAC_D1 0x02 // Read/Write D1: 00000010 #define EAC_D2 0x04 // Read/Write D2: 00000100 #define EAC_I 0x08 // Initialize: 00001000 #define EAC_R1 0x10 // Data1 Read: 00010000 #define EAC_R2 0x20 // Data2 Read: 00100000 #define EAC_W1 0x40 // Data1 Write: 01000000 #define EAC_W2 0x80 // Data2 Write: 10000000 Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 39
Beispiel: EA-Simulation 5 Initialisierung EA-Gerät: data1, data2 lesen if(ea_ctrl(eac) & EAC_R) // EA bereit? eac = EAC_I | EAC_R1 | EAC_R2; // EA progr. Lesen von data1, data2 c = ea_ctrl(eac); // control lesen if(c & EAC_R) { // EA bereit? if(c & EAC_D1) { // Daten in data1 d1 = ea_read(ead1); // ... lesen ... // ... verarbeiten } if(c & EAC_D2) { // Daten in data2 d2 = ea_read(ead2); // ... lesen ... // ... verarbeiten } Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 40
Beispiel: EA-Simulation 6 easim.c – EA-Simulation Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 41 41
Beispiel: EA-Simulation 7 easim in Aktion Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 42