Operatoren und Ausdrücke Zuweisungsoperator Arithmetische Operatoren Vergleichsoperatoren Logische Operatoren und Ausdrücke Implizite Typ-Umwandlung Rangordnung der Operatoren / Reihenfolge der Auswertung Mathematische Funktionen Seite Zuweisungsoperator Zuweisung: dient zur Festlegung des Wertes von Variablen allgemeine Form: linkswert = ausdruck Beispiele: a=3.7; Dichte = m/vol; x = 6.9 * a + (66.987 +(r + m)); Linkswert: Name einer Variablen Zuweisungsoperator: = auszuführende Operation: Transport des Wertes von ausdruck auf den Speicherplatz von linkswert Seite 2
Arithmetische Operatoren Arithmetische Operatoren: + Addition - Subtraktion * Multiplikation / Division % Divisionsrest (nur für ganze Zahlen) Vorrangregeln: Punktrechnung vor Strichrechnung ; von links nach rechts Besonderheiten: Operanden vom gleichen Datentyp liefern ein Ergebnis vom selben Datentyp, also ergibt a/b bei zwei integer-größen wieder eine integer-größe (Nachkomma-Stellen werden abgeschnitten) bei gemischten Ausdrücken ist das Ergebnis vom "höheren" Datentyp, also ist das Ergebnis bei einer integer- und einer float-größe vom Datentyp float Seite 3 Arithmetische Operatoren Beispiele: int i=5, j=2, k=23; float x=2.0, y=5.5; double d=2.4; liefert: Ausdruck i/j k%i*j k-7%5 x*y-i y/x 4/3*x y%x d/2 das heißt 5/2 23%5*2 3*2 23-7%5 23-2 2.0*5.5-5 -5 5.5/2.0 4/3*2.0 *2.0 unzulässig 2.4/2 Ergebnis 2 6 2 6.0f 2.75f 2.0f unzulässig.2 Seite 4
Vergleichsoperatoren Gleichheitsoperatoren (equality operators): ==!= Vergleichsoperatoren (relational operators): < > <= >= Beispiel: int nmax=20, m=3, n=6, jmax=5; char c='k'; float x=0.0, EPS=E-6; liefert Ausdruck m<4 n>nmax x>=eps (n+jmax)>nmax c>'a' c!='k' x==0.0 nmax>n>jmax das heißt 3<4 6>20 0.0>=E-6 (6+5)>6 2>6 'K'>'A' 75>65 'K'!='k' 75!= 07 0.0==0.0 20>6>5 >5 Ergebnis - bedeutet TRUE 0 - bedeutet FALSE 0 0 Seite 5 Vergleichsoperatoren Häufige Fehler a=<b a < = b x+y =! 44 n+jmax>nmax a>>b a=b x =! 44 if (a=b)... x==0.0 =< ist kein Vergleichsoperator, richtig: <= Zwischenraum < = unzulässig, Operator nicht erkannt äquivalent zu (x+y) = (!44) nicht beabsichtigte Reihenfolge; jmax>nmax wird zuerst berechnet; Ergebnis: n oder n+ Schiebeoperator, nicht Vergleichsoperator Zuweisungsoperator statt Gleichheitsoperator; syntaktisch aber korrekt, also keine Fehlermeldung!!! äquivalent zu x = (!44) statt if (a==b)... Vergleich mit Null häufig fehlerhaft wegen begrenzter Rechengenauigkeit; besser auf EPS testen Seite 6
Logische Operatoren Verneinung Verneinung NOT:! kann auf jeden einfachen Ausdruck angewendet werden liefert für jeden Wert ungleich Null den Wert 0; für Werte exakt gleich Null den Wert Ergebnis ist int Anwendung: wegen Fehlens logischer Variablen int fertig, sortiert;!fertig // nicht fertig!sortiert // nicht sortiert Achtung: normale Logik not(not s) == s gilt nicht;!!5 wird von rechts nach links abgearbeitet:!(!5)=!(0)= Seite 7 Logische Operatoren Konjunktion und Disjunktion Konjunktion UND: && Disjunktion ODER: Anwendung auf logische Ausdrücke Logik-Tabelle: A B!A A && B A B Seite 8
Gemischte Ausdrücke Implizite Typumwandlung sind Operanden unterschiedlichen Datentyps an einer Operation beteiligt, werden vor Ausführung der Operation alle Operanden in den "höheren" Datentyp umgewandelt Wertigkeit der Datentypen Datentyp Wertigkeit long double double float long int short char hoch niedrig bei Konvertierung float int wird abgeschnitten; reicht der Wertebereich nicht, ist das Ergebnis undefiniert Seite 9 Rangordnung der Operatoren Rang Operatoren Bedeutung Richtung () [] ->. Klammern, Strukturen 2! ~ ++ -- + - * & (type) sizeof rechts links 3 * / % Mult, Div, modulo 4 + - Add, Subtr 5 << >> Bit-Verschiebung 6 < <= > >= Vergleich 7 ==!= Gleichheit 8 & UND, Bitoperator 9 ^ exklusiv ODER, Bitoperator 0 inklusiv ODER, Bitoperator && UND 2 ODER 3?: rechts links 4 = += -= *= /= %= &= ^= = <<= >>= rechts links 5, Aufzählung genauere Erklärungen aller Operatoren: siehe z.b. Kernighan / Ritchie Seite 0
Reihenfolge der Auswertung Beispiel: char c='w'; int i=, j=2, k=3; int *pi=&i; float x=6.0,y=5.0; liefert: Ausdruck +2*k (+2)*k 'a'+ < c -i-5*j>=k+ x-y < 0.0 5/2*2 7./2*5 7/2*5. äquival. Ausdruck ('a'+ ) < c ((-i)-(5*j))>=(k+) (x-y) < 0.0 ((5/2)*2) (7./2)*5) (7/2)*5.) Ergebnis 7 9 (TRUE) 0 (FALSE) 0 (FALSE) 4 42.5 40.0 Seite Mathematische Funktionen in der Standardbibliothek math.h verfügbar double sin (double x) double cos (double x) double tan (double x) double asin (double x) double acos (double x) double atan (double x) double atan2 (double x) double cosh (double x) double sinh (double x) double tanh (double x) double exp (double x) double log (double x) double log0 (double x) sin(x); x im Bogenmaß cos(x); x im Bogenmaß tan(x); x im Bogenmaß Arcus-Funktionen arctan (x/y) Hyperbelfunktionen e x ; Exponentialfunktion log(x); natürlicher Logarithmus log 0 (x); dekadischer Logarithmus Seite 2
Mathematische Funktionen double ceil(double x) double floor(double x) double abs(int n) double fabs(double x) double pow(double x,double y) double sqrt(double x) double ldexp(double x,int n) double frexp(double x,int *exp) double fmod(double x,double y) double modf(double x,double *ip) nächsthöhere Ganzzahl als double nächstniedere Ganzzahl als double Absolutbetrag (integer) Absolutbetrag (float) x y für x>0, y ganzzahlig Quadratwurzel aus x, x 0 x*2 n zerlegt x in eine normalisierte Mantisse im Bereich [0.5,], die als Resultat geliefert wird, und eine Potenz von 2, die in *exp abgelegt wird. Ist x Null, sind beide Teile des Ergebnisses Null Gleitkommarest von x/y mit dem gleichen Vorzeichen wie x zerlegt x in einen ganzzahligen Teil und einen Rest, beide mit Vorzeichen von x; Rest ist Ergebnis, ganzzahliger Teil wird in *ip abgelegt Seite 3 Kontrollfragen. In welcher Reihenfolge werden die Operationen in einem arithmetischen Ausdruck ausgeführt? 2. Welchen Datentyp haben die Ergebnisse der einzelnen Operationen? 3. Welche Konsequenzen hat die interne Darstellung der verschiedenen Datentypen auf das Ergebnis der Operationen? 4. Kann man auch mit Zeichen (char-daten) arithmetische Operationen ausführen? 5. Was bewirkt der Modulo-Operator %? Wann wird das %-Zeichen als Modulo-Operator interpretiert? 6. Geben Sie das Ergebnis folgender Ausdrücke an: 5%4*7/5 +.5 5%(4*7/5) +.5 5%4*7.0/5 +.5 5%4*(7.0/5) +.5 5*7%4/5 +.5 (5*7%4)/5 +.5 5*7%4/5.0 +.5 5*(7%4/5.0) +.5 Seite 4