1 / 181

Elementare Konzepte von Programmiersprachen

Elementare Konzepte von Programmiersprachen. Teil 1: Bezeichner, Elementare Datentypen, Variablen, Referenzen, Zuweisungen , Ausdrücke (KW 2002, Kapitel 6.3—6.7). Foliensatz von A. Weber zur Vorlesung Informatik I, Bonn, 2002/03 Überarbeitet von W. Küchlin zu Informatik I, Tübingen 2003/04.

magee
Download Presentation

Elementare Konzepte von Programmiersprachen

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Elementare Konzepte von Programmiersprachen Teil 1: Bezeichner, Elementare Datentypen, Variablen, Referenzen, Zuweisungen, Ausdrücke (KW 2002, Kapitel 6.3—6.7) Foliensatz von A. Weber zur Vorlesung Informatik I, Bonn, 2002/03 Überarbeitet von W. Küchlin zu Informatik I, Tübingen 2003/04 W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java -1- Springer-Verlag, ISBN 3-540-20958-1

  2. Schlüsselwörter, Literale, Namen (Syntax von Bezeichnern) (KW 2002, Kapitel 6.3) W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java -2- Springer-Verlag, ISBN 3-540-20958-1

  3. Bezeichner • Bezeichner (identifier) in Programmiersprachen für viele Dinge notwendig • Sprachkonstrukte • Z.B. while-Schleifen, Arithmetische Operatoren wie + • Elemente von bekannten Datentypen • Etwa ganze Zahlen • In der Programmiersprache Definierbares • Variablen, Klassen, Funktionen, Methoden, ... W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java -3- Springer-Verlag, ISBN 3-540-20958-1

  4. Bezeichner • Alphabet • Ein Alphabet ist eine geordnete Zeichenmenge (Zeichensatz) (i.a. bestehend aus Buchstaben, Zahlen, Sonderzeichen) • Oft wird Auswahl des ASCII-Zeichensatzes genommen • In Java wird UNICODE zugrunde gelegt • Bildung von Wörtern über Alphabet für Bezeichner • Zeichenreihen, die gewissen Regeln entsprechen • Oftmals festgelegt als reguläre Ausdrücke • Dieser Begriff wird in Vorlesung über formale Sprachen (theoretische Informatik) genauer definiert W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java -4- Springer-Verlag, ISBN 3-540-20958-1

  5. Bezeichner • Syntax ist die korrekte Art und Weise, sprachliche Elemente zusammen zu fügen und zu Sätzen zu ordnen • Syntax von Programmen meist als formale Grammatik gegeben • Meist kontextfreie Sprache • Näheres hierzu auch wieder in Vorlesung zu formalen Sprachen • Wird vom Übersetzer geprüft • Schlüsselwörter sind fest vordefinierte Bezeichner für Elemente der Sprache. Dienen zur Formulierung von Anweisungen • Dürfen nicht als Bezeichner für selbst Definierbares genommen werden • Operatoren einer Sprache meist durch Kombination von Sonderzeichen • Etwa <=, ++, --, == • Literale bezeichnen Elemente bekannter Datentypen • Etwa 123 für eine ganze Zahl, 12.3 für Gleitkommazahl, `z` für ein Zeichen W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java -5- Springer-Verlag, ISBN 3-540-20958-1

  6. Schlüsselwörter • Schlüsselwörter in Java goto und const werden momentan nicht verwendet; assert und strictfp seit Java 2; zusätzlich reservierte Wörter true, false, null W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java -6- Springer-Verlag, ISBN 3-540-20958-1

  7. Namenskonventionen • Namen von Schlüsselwörtern und Operatoren i.A. nichterlaubt für selbstdefinierte Bezeichner • Mit Ausnahmen • In C++: Namen von Operatoren können für selbstdefinierte Funktionen wiederverwendet werden (Operator overloading) • Neben in Sprachdefinition fest vorgegebenen Regeln (die vom Compiler überprüft werden) gibt es auch Namenskonventionen • Weichen in den verschiedenen Sprachen voneinander ab • Einhalten der Namenskonventionen sehr sinnvoll! • Zwar keine „gesetzliche Vorschrift“, aber „guter Sprachgebrauch“ • Erleichtert das Lesen von Programmen • vor allem durch andere Programmierer • durch den Programmierer selbst, wenn er sein Programm nochmals anschaut W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java -7- Springer-Verlag, ISBN 3-540-20958-1

  8. Namenskonventionen • In Java: • Namen für Klassengroßgeschrieben • Beginnen daher mit Buchstaben • Alle Namen für Funktionen (Methoden) und Variablenkleingeschrieben • Beginnen daher auch mit Buchstaben • Bei zusammengesetzten Namen schreibt man angefügte Teile jeweils wieder groß • Alle UNICODE Buchstaben erlaubt, auch Umlaute etc. • Kann missbraucht werden: verschiedene Buchstaben mit gleichem Druckbild • Beispiel: • Gerät ist ein Klassenname • z ein Variablenname • getZ der Name eines Selektors für die Variable (das Feld)z • Weitere Methodennamen sind wähleKanal oder bewegePunktZuPunkt W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java -8- Springer-Verlag, ISBN 3-540-20958-1

  9. Namenskonventionen • In C++ • Konvention ist Verwendung des „Underscore-Zeichens“ _ zur Verbindung von Namensbestandteilen • Beispiel: waehle_Kanal • Daher keine Schreibkonvention für Variablen • Unterscheidbar sind etwa get_z und get_Z • Verwendung von ASCII-Buchstaben (und _) nicht nur Konvention, sondern wird von der C++ Sprachdefinition vorgeschrieben W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java -9- Springer-Verlag, ISBN 3-540-20958-1

  10. Namenskonventionen • Bemerkung: Namenskonventionen abhängig von Syntax von Programmiersprachen • Verwendete Konvention in einer Sprache manchmal nicht legal in einer anderen • Etwa Verwendung eines Minus-Zeichens - in LISP zur Trennung von Namensbestandteilen würde zu Syntaxfehler in Java führen • Oder gar zu einem schwer zu findenden Programmfehler • Namen können z.B. in FORTRAN nur 8 Zeichen lang sein • Verwendung langer Bezeichner erleichtert das Lesen von Java, C, C++ Programmen wesentlich gegenüber FORTRAN-Programmen W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java -10- Springer-Verlag, ISBN 3-540-20958-1

  11. Elementare Datentypen W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java -11- Springer-Verlag, ISBN 3-540-20958-1

  12. Elementare Datentypen • Elementare Datentypen in Java W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java -12- Springer-Verlag, ISBN 3-540-20958-1

  13. Literaldarstellungen • Literaldarstellung für elementare Datentypen in Java • Gibt es für boolean, char, int, long, float und double • Ziffernfolgen (evtl. mit Vorzeichen) bezeichnen ein int • Ziffernfolgen werden im Dezimalsystem interpretiert, es sei denn, sie beginnen mit 0 oder 0x • Mit 0 beginnende Ziffernfolgen werden als Oktalzahlen interpretiert • Mit 0x beginnende als Hexadezimalzahlen • Zeichen a, b, c, d, e, f für 10, 11, 12, 13, 14, 15 • Achtung: 14  014  0x14 • Nachgestelltesloder L ein long • Zahl mit Dezimalpunkt ein double • Oder mit einem e bzw. E für Zehnerexponenten • Oder ein nachgestelltes d • Nachgestelltes f (oder F) macht daraus ein float • 23 -3 +53 • 0270x17 0x1b 0xffff • 23l -3L +53L 027L • 2. -3.4 53e4 • 0d 2d -3.4d 53e4d • 2f -3.4f 53e4f W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java -13- Springer-Verlag, ISBN 3-540-20958-1

  14. Elementare Datentypen • In Java stellt man Zeichenwert entweder durch Zeichen in Hochkommata dar • Falls Tastatur es erlaubt, und es kein Sonderzeichen ist • Etwa ein Hochkomma • Beispiel: char c = ´A´; • Oder gibt Bitmuster in UNICODE als Hexadezimalzahl an • Beispiel: char c = ´\u0041´; • „Fluchtsequenzen“ (Escape-Sequenzen) für Zeichen in Java W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java -14- Springer-Verlag, ISBN 3-540-20958-1

  15. Hüllklassen für elementare Datentypen • Für alle elementaren Datentypen gibt es Hüllklassen • Elementare Datentypen beginnen alle mit Kleinbuchstaben, entsprechende Hüllklasse mit Großbuchstaben • Byte, Short, Integer, Long, Float, Double, Character, Boolean • Funktion von Hüllklassen • Bündelung von Konstanten und Methoden, die im Zusammenhang mit den elementaren Typen nützlich sind • Verwendung von Daten elementarer Datentypen als Klassenobjekte • Etwa zum generischen Programmieren • Siehe später • In C# sind die Hüllklassen eingebaut • Objektsicht immer (verlustfrei) möglich: 5.add(6) W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java -15- Springer-Verlag, ISBN 3-540-20958-1

  16. Variablen Referenzen Zuweisungen W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java -16- Springer-Verlag, ISBN 3-540-20958-1

  17. Variablen • Variablen dienen der Speicherung von Werten • Name (name) bezeichnet die Variable im Programm • Wert(value) ist ein Element eines Datentyps der zugehörigen Programmiersprache • Typ (type) legt mögliche Werte und Codierung fest • Variable ist (zunächst) Paar(Name, Wert) • Abstraktion des Konzepts der Speicherstelle • (Adresse, Inhalt) W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java -17- Springer-Verlag, ISBN 3-540-20958-1

  18. Variablen • Übersetzerordnet VariablenSpeicherstellen zu • Abbildung von • Name auf Adresse • Wert auf Inhalt der Adresse (und umgekehrt) • Aus Wert kann gemäß des Typs der Variablen auf den Inhalt geschlossen werden (und umgekehrt) • Im laufenden Programm Variable vollständiger durch Tupel ((Name, Wert), (Adresse, Inhalt)) charakterisiert W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java -18- Springer-Verlag, ISBN 3-540-20958-1

  19. Variablen • Die genaue Auflistung der Speicherstelle ist aber oft nicht realistisch und auch nicht nützlich • Übersetzer legen die Adresse einer Variablen i. a. nicht auf Hardware-Ebene fest, sondern abstrakter • Etwa relativ zum Anfang eines Speicherbereichs • Die endgültige Zuordnung wird dann vom Betriebssystem in Verbindung mit der memory management unit (MMU) der Hardware erst zur Laufzeit vorgenommen • Wir sprechen lieber abstrakter von Verweis(auf einen Speicherplatz) oder von Referenz • Statt von einer Adresse • In Schaubildern verwendet man oft Zeiger (pointer), um Referenzen darzustellen • Symbolisiert durch Pfeile • Insbesondere wenn die konkreten Adressen gar keine Rolle spielen W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java -19- Springer-Verlag, ISBN 3-540-20958-1

  20. Beispiel: Der Wert der Variablen mit dem Namen x ist 17 Die Referenz ist die Adresse 203, an der der Wert gespeichert ist Der dort tatsächlich gespeicherte Inhalt ist das Bitmuster 10001 Wenn wir 17 als Java-Literal für einen int Wert ansehen dürfen Und die führenden Nullen nicht darstellen Eine noch abstraktere Form der Darstellung der Referenz ist der Pfeil auf die entsprechende Speicherstelle Variablen W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java -20- Springer-Verlag, ISBN 3-540-20958-1

  21. Referenzvariablen • Variablen, deren Wert wiederum eine Referenz ist, heißen Zeigervariablen(pointer variable, pointer) oder Referenzvariablen(reference variable, reference) • Der spezielle Wert null, das einzige Element des Nulltyps(null type), symbolisiert die „leere Referenz“, die auf keine gültige Speicherstelle verweist • Auf Maschinenebene ist null i.A. durch den Zahlwert Null repräsentiert W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java -21- Springer-Verlag, ISBN 3-540-20958-1

  22. Referenzvariablen • Beispiel • Der Wert der Zeigervariable x ist die Referenz der Variable y, die ihrerseits den Wert 15 hat y hat Typ int x hat Typ „Referenz-auf-int“ (gibt es in C/C++, aber so nicht in Java) W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java -22- Springer-Verlag, ISBN 3-540-20958-1

  23. Reihungsvariablen • In Java sind Reihungen (arrays) Spezialfälle von Klassen • Wir führen sie daher erst später wirklich ein  • Da sie aber zu den Grundkonzepten des Programmierens gehören, geben wir hier bereits einen kurzen Überblick • Ist T ein Typ, so ist T[] der Typ Reihung(array) von Elementen des Typs T • Kurz Reihung von Toder T array • Der Komponententyp T kann einfach oder wieder zusammengesetzt sein • Beispiele: Der Typ int[] ist eine Reihung von Ganzzahlen, String[] eine Reihung von Strings (Zeichenketten) W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java -23- Springer-Verlag, ISBN 3-540-20958-1

  24. Reihungsvariablen • Eine Reihungsvariable T[] a; ist eine Referenzvariable, deren Wert auf ein konkretes Reihungsobjekt verweist • Mit new T[n]erzeugenwir ein (zunächst anonymes) Reihungsobjekt der Längen, also mit n Elementen • Nach T[] a = new T[n]; • ist dieses Objekt der Wert von a • stellt uns der Compiler eine passende Anzahl von Variablennamen a[0], a[1], ... a[n-1] zur Verfügung W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java -24- Springer-Verlag, ISBN 3-540-20958-1

  25. Reihungsvariablen: Halde und Stapel • In Java: Alle Klassenobjekte bekommen ausschließlich durch den Operator new Speicher zugeteilt • Operator new teilt Speicher immer vom Haldenspeicher(heap) zu; • Die Objektvariablen liegen dagegen auf dem Stapelspeicher(stack), und ihre Werte sind Zeiger auf die Objekte auf der Halde (heap) • Dies gilt insbesondere auch für Reihungsvariablen und Reihungsobjekte W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java -25- Springer-Verlag, ISBN 3-540-20958-1

  26. Reihungsvariablen: Halde und Stapel • Beispiel: • Die Speicherbereiche Stapel und Halde nach der Anweisung int[] a = new int[3]; W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java -26- Springer-Verlag, ISBN 3-540-20958-1

  27. Java Arithmetik W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java -27- Springer-Verlag, ISBN 3-540-20958-1

  28. Elementare Ganzzahltypen • Zahlbereiche der Ganzzahltypen W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java -28- Springer-Verlag, ISBN 3-540-20958-1

  29. Java Arithmetik: Konversionsmethoden in Hüllklassen • Konversionsmethoden in Hüllklassen W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java -29- Springer-Verlag, ISBN 3-540-20958-1

  30. Java Arithmetik: Konversionsmethoden in Hüllklassen • Beispiel: Wenn wir unser Rahmenprogramm Program2 mit der Kommandozeile java Program2 123 456 aufrufen, dann erhalten wir innerhalb von main in der Variablen args[0] zunächst nur die Zeichenkette "123" und in der Variablen args[1] die Zeichenkette "456". Falls wir aber entsprechende Ganzzahlen benötigen, etwa in den Variablen int x, y;, dann können wir diese danach mit x = Integer.parseInt(args[0]); und y = Integer.parseInt(args[1]); erhalten (parseInt implementiert die Konversion dezimal dual aus 2.5.1) W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java -30- Springer-Verlag, ISBN 3-540-20958-1

  31. Ganzzahlarithmetik • Java Ganzzahl-Arithmetik ist Zweierkomplement-Arithmetikmodulo dem Darstellungsbereich • Es werden keine Überläufe erzeugt sondern nicht darstellbare Bits einfach abgeschnitten • Dadurch wird der Darstellungsbereich zu einem „Ring“ geschlossen • Zählt man über das Ende des positiven Bereichs hinaus, kommt man zur kleinsten negativen Zahl und schließlich zu -1 und zu 0 • Vgl. Kapitel 2.5.1 über elementare Datentypen W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java -31- Springer-Verlag, ISBN 3-540-20958-1

  32. Ganzzahlarithmetik • Ganzzahldivision • Operator für Ganzzahldivision wird in Java mit / bezeichnet, der Rest bei Ganzzahldivision mit % • Achtung:1/2 + 0.5 == 0.5, aber 1.0/2 + 0.5 == 1.0 • Java rundet immer zur Null hin, um Ganzzahlen zu erhalten • Die Ganzzahl-Division 3/2 ergibt 1, und -3/2 ergibt -1 • Für Ganzzahlen gilt (x/y)*y+x%y == x • d.h. 3%2 ergibt 1 und (-3)%2 ergibt -1 W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java -32- Springer-Verlag, ISBN 3-540-20958-1

  33. Gleitkommaarithmetik • Java Gleitkomma-Arithmetik implementiert den IEEE 754-1985 Standard • Die einfach genauen(single precision, 32bit) Zahlen heißen float • Die doppelt genauen (double precision, 64bit) heißen double • Arithmetik kann nach +und -überlaufen (overflow) • Die Zahlen werden absolut zu groß für die gewählte Repräsentation • Es gibt Werte für (POSITIVE INFINITY) und (NEGATIVE INFINITY) • oder nach +0.0 oder -0.0 unterlaufen (underflow) • Die Zahlen werden absolut zu klein • Wie in IEEE 754 vorgesehen gibt es daher eine positive und eine negative Null, wobei +0.0 == -0.0 • Der Wert NaN ( not a number) repräsentiert Rechnungen, denen kein Wert sinnvoll zugewiesen werden kann • Etwa 0 * (+) W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java -33- Springer-Verlag, ISBN 3-540-20958-1

  34. Zur Erinnerung: Floating-Point • Spezielle Floating-Point-„Zahlen“ • Es gibt Bitmuster für • + (positiv Unendlich) • - (negativ Unendlich) • NaN („Not a Number“) • Wenn kein „sinnvolles“ Ergebnis einer arithmetischen Operation zugewiesen werden kann • Etwa 0/0 • Oder + + - • Beachte aber, dass etwa + + 5 den Wert + hat W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java -34- Springer-Verlag, ISBN 3-540-20958-1

  35. Gleitkommaarithmetik • Java Arithmetik ist non-stop • Rechnung liefert immer einen Wert • Evtl. NaN • Ausdrücke, in denen NaN vorkommt, liefern immer NaN als Ergebnis • In Hüllklassen Konversion (parsing) aus Strings (und in Strings) • Sowie von float nach int mit gleichem Bitmuster und double nach long mit gleichem Bitmuster (int floatToIntBits(float), float intBitsToFloat(int)) W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java -35- Springer-Verlag, ISBN 3-540-20958-1

  36. Zur Erinnerung aus Kap. 2: Floating-Point • Floating-Point-Zahlen nach IEEE 754-1985 • 32 bitfloat • 64 bitdouble • Genauigkeiten W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java -36- Springer-Verlag, ISBN 3-540-20958-1

  37. Im Gegensatz zur Ganzzahlarithmetik kann es bei Floating-Point-Operationen zu Rundungsfehlern (round off error) kommen Multiplikationen erzeugen z.B. längere Mantissen, die wieder auf Standardformat gerundet werden müssen Bei der Addition muss eine Mantisse so verschoben werden, dass beide Zahlen mit dem gleichen Exponenten dargestellt sind Hierbei können einige und im Extremfall alle Bits der Mantisse eines Summanden aus dem Darstellungsbereich herausfallen Beispiele: Der Einfachheit halber Dezimal Mantisse 3 Stellen Zur Erinnerung: Floating-Point 1.34e0*3.45e2=4.623e24.62e2 1.34e0+3.45e2 0.0134e23.4500e2 W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java -37- Springer-Verlag, ISBN 3-540-20958-1

  38. Gleitkommaarithmetik • Sonderfälle für Gleitkommadivision W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java -38- Springer-Verlag, ISBN 3-540-20958-1

  39. Operatoren und Ausdrücke W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java -39- Springer-Verlag, ISBN 3-540-20958-1

  40. In Java (wie in C, C++) haben Zuweisungen einen Wert Wie arithmetische Operationen Wert einer Zuweisung ist die rechte Seite der Zuweisung selbst Damit können Zuweisungen als (Teil-)Ausdrücke verwendet werden, und die eigentliche Zuweisung an die Variable geschieht als Seiteneffekt Methodisch problematisch, ermöglicht manchmal kürzeren Code In Pascal haben Zuweisungen keinen Wert und solche Konstruktionen sind nicht möglich Beispiele: x = y = 1 bezeichnet x = (y = 1) Der Wert von y = 1 ist 1, das an x zugewiesen wird Als Seiteneffekt wird 1 an y zugewiesen x = (y = 1) + 5 hat den Wert 6 und weist als Seiteneffekt y den Wert 1 und x den Wert 6 zu Zuweisungsoperatoren • In Java, C, C++: Name des Zuweisungsoperators = • Name des Vergleichsoperators auf Gleichheit== • In Pascal Name des Zuweisungsoperators := • Name des Vergleichsoperators auf Gleichheit = W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java -40- Springer-Verlag, ISBN 3-540-20958-1

  41. Zuweisungsoperatoren • Zuweisungsausdrücke der Form v = v+exprkönnen in Java auch in der Form v += expr geschrieben werden • Solche Zuweisungen kommen häufig vor • Hier ist Java wieder in der Tradition von C und C++ • Für jedenbinären Operator gibt es einen entsprechenden kombinierten Zuweisungsoperator in Java • Etwa -= *= /= %= >>= usw. • Wert von v = v  expr und v = expr (zunächst) gleich • Dabei steht für einen der binären Operatoren W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java -41- Springer-Verlag, ISBN 3-540-20958-1

  42. Zuweisungsoperatoren • Genauer: Bei v = expr wird Wert von v nur ein einziges Mal ausgewertet • Im Gegensatz zu v = v  expr • Falls v selbst durch einen Wert bestimmt wird, kann dies zu einem Unterschied führen • Etwa wenn v ein Arrayzugriff mit Seiteneffekt ist a[i++] • Eher pathologische Fälle • Sollten bei „gutem Programmierstil“ nicht vorkommen W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java -42- Springer-Verlag, ISBN 3-540-20958-1

  43. Arithmetische Operatoren • Für die elementaren Zahltypen sind jeweils die • unären Operationen + und -, • sowie die binären Operationen +, -, *, / und % (Rest der Division) definiert • Auf den Ganzzahltypen ist / die Ganzzahldivision, auf Floating-Point Werten die „übliche“ Division • Auf den Gleitkommatypen existiert im Gegensatz zu C/C++ ebenfalls die moduloOperation % • Beispiel: 7.0 % 2.5 ergibt 2.0 W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java -43- Springer-Verlag, ISBN 3-540-20958-1

  44. Inkrement und Dekrement-Operatoren • Java kennt (wie C und C++) unäre Operatoren ++ und-- • Können in Postfix und Präfixform verwendet werden • Der Wert des Ausdrucks i-- (bzw. i++) ist der Wert der Variablen i, und als Seiteneffekt wird der Wert von i um Eins erniedrigt (bzw. erhöht) • Der Wert des Ausdrucks --i (bzw. ++i) ist der Wert von i-1 (bzw. i+1), und als Seiteneffekt wird der Wert von i um Eins erniedrigt (bzw. erhöht) • Anders ausgedrückt geschieht der Seiteneffekt der Präfixform logisch vor der Rückgabe des Variablenwertes, der der Postfixform danach • In Java können diese Operatoren auch auf Werte vom Typ float und double angewendet werden W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java -44- Springer-Verlag, ISBN 3-540-20958-1

  45. Inkrement und Dekrement-Operatoren • Die Operatoren wie += und ++ wurden in C eingeführt, um spezielle Instruktionen von CISC Prozessoren ausnützen zu können • Und damit effizienteren Code zu erzeugen • Ob sie zu einem Geschwindigkeitsgewinn führen, hängt vom Prozessor und dem Übersetzer ab • Bei heutigen Übersetzern, die den erzeugten Code hoch optimieren können, wird es so gut wie nie zu einem Geschwindigkeitsvorteil kommen W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java -45- Springer-Verlag, ISBN 3-540-20958-1

  46. Inkrement und Dekrement-Operatoren • In jedem Fall ist der Gebrauch der Kurzformen inzwischen z. T. idiomatisch geworden • d. h. Ausdrücke wie i++ sind Teil gewisser Programmiermuster (oder -Idiome), die ein C, C++ oder JavaProgrammiererautomatisch anwendet und versteht • Es hat sich z. B. eingebürgert, die Postfixform i++ als kanonische Inkrementform zu benutzen; man schreibt also immeri++; statt der gleichwertigen Anweisungen i += 1; oder i = i+1; • Wir werden weitere solche Idiome im Zusammenhang mit Schleifenkonstrukten und Reihungen kennen lernen W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java -46- Springer-Verlag, ISBN 3-540-20958-1

  47. Boolesche Operatoren • In Java wird der Typ boolean mit den Booleschen Literalentrue und false zur Verfügung gestellt • In C und in frühen Versionen von C++ benutzt man stattdessen 0 für false und Werte ungleich 0 für true • Als logische Operatorenexistieren W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java -47- Springer-Verlag, ISBN 3-540-20958-1

  48. Boolesche Operatoren • Die Operatoren && und ||heißen auch bedingtelogische Operatoren, da sie ihren rechten Operanden nur dann auswerten, falls dies wirklich nötig ist • Faule Auswertung, lazy evaluation • In ((b = false) && (c = true)) wird also die Zuweisung c = true nicht ausgeführt, da der Wert der Zuweisungb = false wieder false ist und damit der Wert des Gesamtausdrucks schon als false feststeht • Im Gegensatz dazu evaluieren die symmetrischen binären Operatoren &,| und ^ jeweils beideOperanden • Man beachte, dass diese Operatorsymbole überladen sind und auch Operationen auf Bitmustern bezeichnen können (siehe später) W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java -48- Springer-Verlag, ISBN 3-540-20958-1

  49. Boolesche Werte undVergleichsoperatoren auf Zahltypen • Boolesche Werte werden sehr oft durch Vergleiche von Werten anderer Typen erzeugt • In Java gibt es wie üblich die sinnvollen Vergleichsoperatoren für die gängigen Datentypen Beispiele: (x%2 == 0) liefert true, falls ein ganzzahliges x geradzahlig ist, und falsesonst. ((a >= b) || (a <= b)) && (a !=a ) evaluiert zu false W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java -49- Springer-Verlag, ISBN 3-540-20958-1

  50. Boolesche Operatoren und Vergleichsoperatoren • Bemerkung: • In Java (wie in C/C++) führt die Verwechslung des Gleichheitsoperators== mit dem Zuweisungsoperator= zu einem „beliebten“ und schwer zu findenden Programmierfehler • Hat man eine Variable boolean a = false; so evaluiert nämlich der Ausdruck (a = true) zu true, da dies der Wert der Zuweisung ist • Es hat sich daher eingebürgert, keine Vergleichsoperatoren auf Boolesche Werte anzuwenden • Man schreibt also (a && !b) statt (a == true && b == false) W. Küchlin, A. Weber: Einführung in die Informatik – objektorientiert mit Java -50- Springer-Verlag, ISBN 3-540-20958-1

More Related