Upload
margareta-rech
View
105
Download
0
Embed Size (px)
Citation preview
Informatik IIGrundlagen 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
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 2
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– Datentyp– Namen / Identifier– Parametertypen bei Funktionen
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 3
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 4
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 5
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 6
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 7
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 8
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 9
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ückeeffizient auswerten / optimieren
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 10
Operatoren 1
• Szene aus: Is' was, Doc? (1972) - youtube
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 11
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 12
Operatoren 3
• Zahl der Operanden– 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 13
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 14
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; dezimalshort x = 0x20 sedezimal (Basis 16)int y = 020; oktal (Basis 8)
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 15
Ganzzahloperatoren 2
• Dezimal-, Sedezimal-, Binärdarstellung
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 16
Ganzzahloperatoren 3
• binprt.c – Integer dez / hex / binär ausgeben
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 17
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 18
Ganzzahloperatoren 5
• Vergleichsoperatoren == != < > <= >=• expr1 op expr2
• Ergebnis: wahr 1, falsch 0• Ergebnistyp int
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 19
Ganzzahloperatoren 6
• Logische Operatoren ! && ||
• Ergebnis: wahr 1, falsch 0 (Typ int)• expr1 op expr2
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 20
Ganzzahloperatoren 7
• Bitoperatoren ~ & | ^
• expr1 op expr2 bzw. ~expr
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 21
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 22
Ganzzahloperatoren 9
• bitops.c - Bitoperationen
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 23
Ganzzahloperatoren 10
• bitshift.c – Bitshift links und rechts
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 24
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 25
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 26
Zeichenoperatoren 2
• ASCII-Zeichensatz 7 Bit
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 27
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 28
Zeichenoperatoren 4
• ascii.c – ASCII-Tabelle ausgeben
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 29
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 30
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 31
Fließkommaoperatoren 2
• 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 32
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 33
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 34
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 35
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 36
Beispiel: EA-Simulation 1
• Microcontroller mit E/A-Geräten, z.B. Sensoren
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 37
Beispiel: EA-Simulation 2
• Schematischer Aufbau eines Embedded System
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 38
Beispiel: EA-Simulation 3
• Modell EA-Register für EA-Simulation
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 39
Beispiel: EA-Simulation 4
• Modellierung der EA-Register in Ctypedef unsigned char byte;static byte eac; // EA-Controlstatic byte ead1; // EA-Data 1static 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 40
Beispiel: EA-Simulation 5
• Initialisierung EA-Gerät: data1, data2 lesenif(ea_ctrl(eac) & EAC_R) // EA bereit? eac = EAC_I | EAC_R1 | EAC_R2; // EA progr.
• Lesen von data1, data2c = ea_ctrl(eac); // control lesenif(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 41
Beispiel: EA-Simulation 6
• easim.c – EA-Simulation
Programmieren in C - Peter Klingebiel - HS Fulda - DVZ 42
Beispiel: EA-Simulation 7
• easim in Aktion