Präsentation herunterladen
Die Präsentation wird geladen. Bitte warten
Veröffentlicht von:Heiko Schneider Geändert vor über 5 Jahren
1
3.4 Ausdrücke Wir werden uns in diesem Kapitel näher mit Ausdrücken in Java beschäftigen.
2
Mathematik: Variablen als Stellvertreter
In der Mathematik: Eine Variable ist Stellvertreter für einen Wert. Sie ändert sich nicht. Sie repräsentiert in einem gewissen Kontext den einen unveränderlichen Wert.
3
Mathematik: Variablen als Stellvertreter
Kontext für n Satz: Für alle n N gilt … + n = n(n+1)/2 Beweis: Sei x N beliebig. Fall: x=0. Dann ist die Formel offensichtlich wahr. Fall: x Sei k = x-1 und die Formel wahr für k, also 1+2+…+k = k(k+1)/ Dann gilt 1+2+…+x = 1+2+…+k+(k+1) = k(k+1)/2 +(k+1) = (k+1)(k+2)/ = x(x+1)/2 Satz gilt durch Beweis per Induktion. Q.E.D. Kontext für x Kontext für k
4
Java: Variablen als Behälter (1)
In Java: Variablen dienen als temporäre Behälter für Werte. Namen sind weitgehend frei wählbar. Beispiele: zins, betrag, xPos, zeichen, x1, r2d2 Lexikalische Regeln: Nur Buchstaben, Ziffern und einige Sonderzeichen sind zulässig. Schlüsselworte sind zu vermeiden: class, public, static, while, do, if, int, ... Das erste Zeichen darf keine Ziffer sein: 0achtFuffzehn, 1A, ... sind nicht zulässig. Es wird zwischen Groß- und Kleinschreibung unterschieden!
5
Java: Variablen als Behälter (2)
Konvention (in Java üblich) Variablennamen beginnen mit Kleinbuchstaben: zinsSatz, buchstabe, diplomArbeit Zusammengesetzte Namen werden durch Großbuchstaben „zerlegt“: untereGrenze, blockEndeMarke Nicht üblich: untere_Grenze, blockendemarke
6
Deklaration (1) Alle Variablen müssen vor ihrer Verwendung deklariert werden. Ihr Typ beschreibt zugleich die zulässigen Werte (den Wertebereich). Syntax: Typname Variablenname; Beispiele: int x; double y, z, eps; boolean ready; String name, vorname; Konto meins, deins, bills;
7
Fehler !! „x nicht initialisiert“
Deklaration (2) Felder in Klassen sind spezielle Arten von Variablen. Sie werden auf dieselbe Art deklariert. Merke: Variablen, die keine Felder sind, werden nicht automatisch initialisiert! void foo() { int x; x = x+1; } Fehler !! „x nicht initialisiert“
8
Typ bestimmt Wertebereich
Jede Variable hat einen Typ. Gründe dafür: Variablen verschiedener Typen benötigen unterschiedlich viel Speicherplatz. Ungewollte Programmierfehler werden erkannt age = thisYear*3.14 Bei der Deklaration von Variablen wird Speicherplatz reserviert. Beispiel: short zins; // 2 Byte int betrag; // 4 Byte double xPos; // 8 Byte char zeichen; // 2 Byte Speicheradressen: zins 1024 1026 1028 1030 1032 1034 1036 1038 1040 betrag xPos zeichen
9
Deklaration mit Initialisierung (1)
Typname Variablenname = Wert; Beispiele int x = 5; double y = 3.1, z = 12, eps = 0.001; boolean ready = true; String name = "Meier", vorname = “Otto“; Konto meins = new Konto();
10
Deklaration mit Initialisierung (2)
Der Wert muss zum Typ passen: int x = 2.0; falsch: 2.0 ist double float y = 2; ok int c = ‘a‘; ok: char wird zu int konvertiert Konto meins = 0; falsch: 0 ist ein int und kein Konto String s = null; ok: die Null-Referenz String s = ""; ok: der leere String. "" null! Konto deins = null; ok: Null passt zu jedem Objekttyp Konto unseres = ""; falsch: leerer String ist kein Konto.
11
Aufgaben von Variablen
Man kann eine neue Variable einführen (deklarieren) Platz für den zu speichernden Wert wird reserviert. Beispiele: int kontoStand; float abstand; einen neuen Wert in der Variablen speichern Der alte Wert wird dabei überschrieben. kontoStand = 235; abstand = 3.71; den in der Variablen gespeicherten Wert lesen implizit, bei der Auswertung von Ausdrücken, in denen Variablen vorkommen kontoStand + 10, Math.sqrt(abstand*abstand )
12
Kontext Ein Kontext (Umgebung) wird durch eine aktuelle Bele- gung von Variablen gegeben. Für jede Variable benötigt man ihren Typ und Wert. Beispiele: Kontext 1: int x = 2; int y = 10; Typ und Wert eines Ausdrucks mit Variablen sind vom gegenwärtigen Kontext abhängig. Beispielausdruck: 1/y + x/y in Kontext 1: 0 (int) in Kontext 2: (double) int x 2 int y 10 1/y+x/y == Kontext 2: int x = 2; double y = 10.0; int x 2 double y 10.0 1/y+x/y ==
13
Kontexte in Java Klammerpaare { … } begrenzen Kontexte.
Variablen sind nur in ihrem Kontext gültig, und zwar von der Deklarationsstelle bis zum Ende des Kontextes. Geschachtelte Kontexte gehören dazu. Im Inneren eines Kontexts ist jede äußere Variable sichtbar. Außerhalb eines Kontextes sind innere Variable unsichtbar! Der Compiler sagt „... cannot find symbol ...“ Variablen dürfen im geschachtelten Kontext nicht neu deklariert werden! Der Compiler sagt: „ x is already defined in ...“ anders als beispielsweise in Pascal oder Delphi!
14
Ausdruck liefert Wert y/3 + x y/3 + x Syntax
Ein Ausdruck ist eine korrekt gebildete Formel aus Konstanten, Variablen Operationszeichen Klammern Beispiel: y/3 + x Semantik In einem Kontext, der alle Variablen des Ausdrucks enthält, bezeichnet ein Ausdruck: einen eindeutigen Wert eines eindeutigen Typs int x 3 float y 6.9 y/3 + x Wert: 5.3 Typ: float int x 3 int y 7 Wert: 5 Typ: int y/3 + x
15
int-Ausdrücke Rekursive Definition
int-Ausdrücke sind: (1) jedes int-Literal (2) jede Variable vom Typ int (3) Sind E1, E2 int-Aus drücke, dann sind auch E1+ E2 , E1- E2, E1* E2, E1/ E2, E1% E2, E2 , E2 int-Ausdrücke. (4) Ist E ein int -Ausdruck, dann ist auch (E) ein int-Ausdruck (Klammerung). int-Ausdruck Siehe auch Boolesche Formeln in Kapitel 3.3
16
float-Ausdrücke Rekursive Definition
float-Ausdrücke sind: (1) jedes float-Literal (2) jede Variable vom Typ float (3) Sind E1, E2 float-Ausdrücke, dann sind auch E1+ E2 , E1- E2, E1* E2, E1/ E2, E2 , E2 float-Ausdrücke. (4) Ist E ein float-Ausdruck, dann ist auch (E) ein float-Ausdruck (Klammerung).
17
Boolesche Ausdrücke Rekursive Definition Boolesche Ausdrücke sind
(1) true, false, (2) jede Variable vom Typ boolean, (3) Sind E1, E2 int -Ausdrücke, dann sind E1 == E2 , E1 != E2, E1 < E2 , E1 <= E2, E1 > E2 , E1 >= E2 boolesche Ausdrücke. (4) Sind B1, B2 boolesche Ausdrücke, dann sind auch ! B1 , B1 || B2 , B1 && B2 boolesche Ausdrücke. (5) Ist B ein boolescher Ausdruck, dann ist auch (B) ein boolescher Ausdruck (Klammerung). Diese Definition verwendet int-Ausdrücke. Auch float- Ausdrücke wären möglich.
18
Exkurs: Syntaxprüfung: Ist der Ausdruck korrekt?
Überprüfung auf „int“ Vorgehensweise: Anwendung der Regeln für int „bottom up“ o.k. (3) (4) (3) (4) (3) (2) (1) (2) (1) betrag * (( zinsSatz) / )
19
Exkurs: Syntaxbaum (1) Die Korrektheitsanalyse liefert eine Hierarchie, einen Baum (Syntaxbaum). Die Regelnummern sind Verzweigungspunkte (Knoten). Die Bestandteile sind Unterbäume. Linien verbinden Knoten mit Unterbäumen. Ersetzt man die Knoten durch die entsprechende Operatoren, so erkennt man, wie der Ausdruck auszuwerten ist: Berechne den Wert W1 des linken Teilbaumes. Berechne den Wert W2 des rechten Teilbaumes. Verknüpfe W1 und W2 mit dem Operator an der Wurzel. Die Klammern fallen dabei weg.
20
Exkurs: Syntaxbaum (2) / (3) * * (3) + (4) (3) betrag 100 zinsSatz 100
(1) (2) (1) betrag * ( zinsSatz) / 100 betrag * ( zinsSatz) / 100
21
Mehrdeutigkeit und Klammern (1)
Ausdrücke mit mehreren Operatoren sind mehrdeutig: 2 – 3 – 4 = ? 2 + 3 * 4 = ? ! fertig || fast && 2 == 3 = ? Wüsste man, wie der Ausdruck gebildet wurde, so wäre die Sache klar. Ansonsten muss man Klammern verwenden oder auf die eingebauten Präzedenzregeln vertrauen.
22
Mehrdeutigkeit und Klammern (2)
! && || || == ! && ! fertig || fast && == 3 == Baum entspricht der Klammerung: ((! fertig)|| fast) && (2 == 3) ! fertig || fast && == 3 Baum entspricht der Klammerung: !(fertig || (fast && (2 ==3)))
23
Bedingte Ausdrücke Form: B ? E1 : E2 Bedeutung:
Falls B dann E1 sonst E2 Voraussetzung: B ist ein boolescher Ausdruck. E1, E2 sind Ausdrücke vom gleichen Typ T Wert hat Typ T Wert(E1), falls Wert(B) == true; Wert(E2), falls Wert(B)==false. Beispiele: (2==3) ? 17 : 18 ergibt 18 (x<y) ? y : x ergibt maximum(x,y) (x <0) ? -x : x ergibt abs(x)
24
Semantik boolescher Operationen
E1 und E2 seien boolesche Ausdrücke, Wert(E1 || E2) := ( Wert(E1) ) ? true : Wert(E2) Wert(E1 && E2) := (! Wert(E1)) ? false : Wert( E2) wie erwartet zweiter Ausdruck wird bitweise ausgewertet „kurze“ Auswertung (lazy evaluation)
25
Präzedenzregeln Präzedenzeregeln sind Regeln, um beim Schreiben Klammern zu sparen. Aus der Schule kennen wir: Punktrechnung geht vor Strichrechnung. Das bedeutet: *, /, % haben Präzedenz vor +,- In der Booleschen Algebra: && hat Präzedenz vor || Einstellige Operatoren haben meist Präzedenz über den mehrstelligen x && !y || z bedeutet (x && (!y)) || z -x+y bedeutet (-x)+y Für Operatoren gleicher Präzedenzstufe legen wir fest: Linksklammerung (fast immer) x – y – z bedeutet: (x-y)-z x % y / z bedeutet: ( x%y )/z Rechtsklammerung bei „Zuweisungsausdrücken“: x = y = x bedeutet : x = (y = x++)
26
Präzedenzen in Java postfix [ ] . (params) expr++ expr –
unary ++expr --expr +expr -expr ! creation/cast new (type)expr multiplicative * / % additive shift << >> relational < > >= <= instanceof equality == != bitwise AND & bitwise exclusive OR ^ bitwise OR | logical AND && logical OR || conditional ? : assignment = += -= *= /= %= >>= <<= >>>= &= ^= |= hoch niedrig
27
Seiteneffekte Die Auswertung eines Ausdrucks verändert den Kontext!
In „sauberen“ Sprachen verboten Haskell, Prolog, Pascal, Oberon, … In „schludrigen Sprachen“ leider üblich C, C++, Java, … Konsequenzen: Mathematische Regeln verletzt: x x++ == 2*(x++) ?? x x == x x++ ?? Das Ergebnis eines Ausdrucks hängt von der Berechnungsreihenfolge ab!
28
Konstanz des Kontextes
Mathematische Gleichungen sind nur in einem festen Kontext gültig. Ändert sich während der Auswertung von x+x der Kontext, so kann eine einfache Gleichung falsch werden: x + x == 2*x ??? x 5 x 6 Ergebnis: = 11 x++ + x x++ + x t4: Addition wird ausgeführt: Ergebnis: 11 t1: x wird gelesen. Resultat: 5 t2: der Kontext wird verändert t3: zweites x wird gelesen Resultat: 6
29
Empfehlungen Ein Ausdruck sollte einen Wert ausdrücken – sonst nichts! Insbesondere sollte die Auswertung keine Seiteneffekte haben. Dies bedeutet, dass wir auf einige „Tricks“ in Java bewusst verzichten. Zum Beispiel: x++, ++x, x--, --x als Teil komplexerer Ausdrücke wie 3*x++, (x++ * y--)/10, … Unkritisch ist das Prä- und Postinkrement dagegen als isolierte Anweisung, z. B.: x++ ; in Schleifen, zum Beispiel for(x=0; x <10; x++) tuwas();
30
Zusammenfassung Variablen sind Platzhalter für Werte, haben eine Typ und müssen deklariert wer- den. int-Ausdrücke, float-Ausdrücke und boolesche Ausdrücke können legal oder illegal sein (Syntax). Die Analyse erfolgt mit einem Syntaxbaum. Ausdrücke haben einen Wert (Semantik). Dieser Wert ist abhängig vom Kontext. Präzedenzen erhöhen die Lesbarkeit von Ausdrücken und sparen Klammern. Seiteneffekte in Ausdrücken sind in Java erlaubt, aber nicht empfehlenswert und für die Programmierung in dieser Vorlesung verboten!
Ähnliche Präsentationen
© 2025 SlidePlayer.org Inc.
All rights reserved.