C- Kurs 03 Ausdrücke und Operatoren Dipl.- Inf. Jörn Hoffmann jhoffmann@informadk.uni- leipzig.de Universität Leipzig InsDtut für InformaDk Technische InformaDk
Ausdrücke Institut für Informatik Ausdrücke Verknüpfung von Variablen und Konstanten mittels Operatoren Zuhilfenahme von Klammern Unterscheidung 1. Arithmetische Ausdrücke a + b; 2. Wertzuweisungen a = b; 3. Inkrementieren u. Dekrementieren a++; u. --a; 4. Logische Ausdrücke a && b; 5. Bedingte Ausdrücke var? a : b; 6. Bitausdrücke a & b; 7. Kommaausdrücke a, b; Jörn Hoffmann C-Kurs Folie 2
1. Arithmetische Ausdrücke Institut für Informatik Operatoren unär : + - binär : + - * / % Syntax übliche, durch Klammerung Semantik Operation abhängig vom Operator und Operandentyp Operationsergebnis besitzt selben Typ wie beide Operanden Beispiele 7 / 3 => 2 7.0/ 3.0 => 2.333333 7.0/ 3 => 2.333333 1 / 2*a => 0 Jörn Hoffmann C-Kurs Folie 3
1. Arithmetische Ausdrücke Typkonvertierung Typkonvertierung erfolgt nach festen Regeln char short int unsigned int unsigned char unsigned short long unsigned long float double grundsätzliche Konvertierung bei verschiedenen Operatoren Jörn Hoffmann C-Kurs Folie 4
Explizite Typumwandlung Institut für Informatik Explizite Typumwandlung engl.: type casting Ausdrücken: (Neuer Typ) Ausdruck; Konstanten: Konstante {u U l L f F} u U = unsigned f F = float l L = long int oder long double Beispiele (float)(1 / 2) => 0.0 (float) 1 / 2 => 0.5 1 / 2f => 0.5 1. / 2 => 0.5 Jörn Hoffmann C-Kurs Folie 5
Operatoren binär : = binär : += -= *= /= %= = &= ^= <<= >>= 2. Wertzuweisungen Syntax einfache Wertzuweisung : var = Ausdruck; komplexe Wertzuweisung: var = Ausdruck; Semantik (Variable = Ausdruck) Zuweisung des Ausdruckswerts an Variable Abarbeitung von rechts nach links Semantik (Variable = Ausdruck) Variable = Variable Ausdruck Unterschied : Anzahl der Speicherzugiffe Jörn Hoffmann C-Kurs Folie 6
2. Wertzuweisungen Institut für Informatik Beispiele int a = 1; => a := 1 a += 2; => a := 3 a <<= 1; => a := 6; a &= 3; => a := 2; a *= a; => a := 4; a %= 3; => a := 1; Jörn Hoffmann C-Kurs Folie 7
2. Wertzuweisung Konvertierung Konvertierung Typ der (linken) Variablen bestimmt Typ der Wertzuweisung Stellen können werden abgeschnitten Bsp.: int x; x = 3.9 * 2; => x := 7 Nebeneffekte Vermeiden von zusammengesetzten Wertzw. in einer Wertzuweisung Implementierungsabhängig Bsp.: int x = 1; x = x + (x += 10); => x:= 1 + (11) := 12 => X:= 11 + (11) := 22 Jörn Hoffmann C-Kurs Folie 8
Operatoren unär : ++ -- 3. Inkrementieren und Dekrementieren Syntax Präfix : ++x --y Postfix : x++ y-- Semantik (++x, x++) Inkrement vor bzw. nach Weiterverwendung Äquivalent zu x=x+1; Semantik (--x, x--) Dekrement vor bzw. nach Weiterverwendung Äquivalent zu x=x 1; Jörn Hoffmann C-Kurs Folie 9
3. Inkrementieren und Dekrementieren Beispiele int x, y=5, z=5; x = --y + 5; => y := 4, x := 9 x = z-- + 5; => z := 4, x := 10 Nebeneffekte Inkrementierte bzw. dekrementierte Variablen sollten in Ausdrücken nur einmal verwendet werden Implementierungsabhängig Bsp.: int x, y=1; x = y++ + y; => 1 + 1 => x := 2 => 1 + 2 => x := 3 Jörn Hoffmann C-Kurs Folie 10
4. Logische Ausdrücke Institut für Informatik Operatoren unär : binär : < > <= >= == = && Syntax übliche Syntax Semantik Logische Ausdrücke entsprechen Bedingungen keine Bool scher Datentyp, daher 1 = wahr, 0 = falsch a b a && b (and) a b (or) a (not) 0 0 0 0 0 1 0 1 1 0 0 1 1 1 1 1 1 0 Jörn Hoffmann C-Kurs Folie 11
4. Logische Ausdrücke Auswertung Auswertung Logische Operatoren werden immer optimierend ausgewertet a && b : ist a falsch, wird b nicht ausgewertet a b : ist a wahr, wird b nicht ausgewertet Beispiele // Division durch Null wird vermieden y == 0 x / y > toleranz; // Einlesen falls Anzahl noch nicht erreicht anzahl < MAX_ZAHLEN && scanf( %f, &zahl) = EOF; Jörn Hoffmann C-Kurs Folie 12
5. Bedingte Ausdrücke Institut für Informatik Operatoren tertiär :?: Syntax Bedingung? Ausdruck1 : Ausdruck2; Semantik Bedingung wahr : Ausdruck1 wird ausgewertet Bedingung falsch : Ausdruck2 wird ausgewertet Beispiel float erg, x; erg = x >= 0? sqrt(x) : -1; if (erg < 0) printf( Nicht lösbar\n ); else printf( Die Wurzel von %f ist %f\n, x, erg); Jörn Hoffmann C-Kurs Folie 13
6. Bitausdrücke Institut für Informatik Operatoren unär : ~ binär : >> << & ^ Syntax übliche Syntax von Ganzzahlen Semantik a b a & b (and) a b (or) a ^ b (xor) ab << 1 (shift-left) ab >> 1 (shift-right) ~a (not) 0 0 0 0 0 00 00 0 1 0 1 1 10 00 1 0 0 1 1 00 01 1 1 1 1 0 10 01 1 0 Jörn Hoffmann C-Kurs Folie 14
6. Bitausdrücke Beispiele Bsp.: Und 1 & 3 : 0000 0001 & 0000 0011 => 0000 0001 (1) Bsp.: Oder 1 3 : 0000 0001 0000 0011 => 0000 0011 (3) Bsp.: Exklusiv-Oder 1 ^ 3 : 0000 0001 ^ 0000 0011 => 0000 0010 (2) Bsp.: Verschieben (auffüllen mit Null) 1 << 3 : 0000 0001 << 3 => 0000 1000 (8) 1 >> 3 : 0000 0001 >> 3 => 0000 0000 (0) Bsp.: Negation ~ 1 : ~ 0000 0001 => 1111 1110 (254) Jörn Hoffmann C-Kurs Folie 15
7. Kommaausdrücke Institut für Informatik Operator binär :, Syntax Listentrennung : int a, b; f(a, b); Operator : Ausdruck, Ausdruck Semantik (bei Ausdrücken) Abarbeitung von links nach rechts Wert und Typ des Ausdrucks entspricht Wert und Typ des rechten Ausdrucks Jörn Hoffmann C-Kurs Folie 16
// Programm zum Stringinvertieren # include <stdio.h> # include <string.h> void invertstring(char *str) { // Komma als Trenner int tmp, begin, end; // Komma als Ausdruck for (begin = 0, end = strlen(str) - 1; begin < end; begin++, end--) tmp = str[begin], str[begin] = str[end], str[end] = tmp; } int main() { char str[] = "beispiel"; invertstring(str); printf("%s\n", str); // leipsieb return 0; } Jörn Hoffmann C-Kurs Folie 17