elementare konzepte von programmiersprachen l.
Download
Skip this Video
Loading SlideShow in 5 Seconds..
Elementare Konzepte von Programmiersprachen PowerPoint Presentation
Download Presentation
Elementare Konzepte von Programmiersprachen

Loading in 2 Seconds...

play fullscreen
1 / 181

Elementare Konzepte von Programmiersprachen - PowerPoint PPT Presentation


  • 255 Views
  • Uploaded on

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.

loader
I am the owner, or an agent authorized to act on behalf of the owner, of the copyrighted work described.
capcha
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.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -
Presentation Transcript
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

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

schl sselw rter literale namen syntax von bezeichnern
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

bezeichner
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

bezeichner4
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

bezeichner5
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

schl sselw rter
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

namenskonventionen
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

namenskonventionen8
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

namenskonventionen9
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

namenskonventionen10
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

elementare datentypen
Elementare Datentypen

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

elementare datentypen12
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

literaldarstellungen
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

elementare datentypen14
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

h llklassen f r elementare datentypen
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

variablen referenzen zuweisungen
Variablen

Referenzen

Zuweisungen

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

variablen
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

variablen18
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

variablen19
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

variablen20
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

referenzvariablen
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

referenzvariablen22
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

reihungsvariablen
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

reihungsvariablen24
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

reihungsvariablen halde und stapel
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

reihungsvariablen halde und stapel26
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

java arithmetik
Java Arithmetik

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

elementare ganzzahltypen
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

java arithmetik konversionsmethoden in h llklassen
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

java arithmetik konversionsmethoden in h llklassen30
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

ganzzahlarithmetik
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

ganzzahlarithmetik32
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

gleitkommaarithmetik
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

zur erinnerung floating point
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

gleitkommaarithmetik35
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

zur erinnerung aus kap 2 floating point
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

zur erinnerung floating point37
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

gleitkommaarithmetik38
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

operatoren und ausdr cke
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

zuweisungsoperatoren
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

zuweisungsoperatoren41
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

zuweisungsoperatoren42
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

arithmetische operatoren
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

inkrement und dekrement operatoren
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

inkrement und dekrement operatoren45
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

inkrement und dekrement operatoren46
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

boolesche operatoren
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

boolesche operatoren48
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

boolesche werte undvergleichsoperatoren auf zahltypen
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

boolesche operatoren und vergleichsoperatoren
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

bitmuster
Bitmuster
  • Jeder Wert eines Ganzzahltyps kann auch als Bitmuster angesehen werden
  • Zur Manipulation dieser Bitmuster stehen logische Operatoren und Schiebeoperatoren zur Verfügung
  • Die bitweisen(bitwise) logischen Operatorenwenden die jeweilige Operation simultan auf jedes Bit der Bitmuster an und liefern ein neues Bitmuster als Wert

Beispiel:

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

bitmuster masken
Bitmuster: Masken
  • Manchmal möchte man nur bestimmte Teile eines Bitmusters herauslesen
    • Viele Gründe:
      • Kleinste adressierbare Speichereinheit ist ein byte
      • Ergebnisse arithmetischer Operatoren 32Bit
      • ...
    • Hierzu benutzt man ein Bitmuster als Maske(mask), das an den entsprechenden Stellen die Bits 1 hat und sonst 0
    • Dann liefert der Ausdruck (Maske & x) das Bitmuster, das in den ausmaskiertenTeilen0 ist und ansonsten gleich wie x
  • Im Beispiel maskiert y die niederen 2 Bits von x aus in (x & y)

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

bitmuster schiebeoperatoren
Die folgenden Schiebe-Operatoren(shift operators) verschieben das Bitmuster innerhalb eines Ganzzahlwertes:

x << n schiebt die Bits in x um n Stellen nach links und füllt rechts Nullen auf.

x >> n schiebt die Bits in x um n Stellen nach rechts und füllt links mit dem Vorzeichenbit auf (arithmetic shift)

x >>> n schiebt die Bits in x um n Stellen nach rechts und füllt links mit Nullen auf (logical shift)

Die jeweils herausgeschobenen Bits werden einfach fallengelassen

Bitmuster: Schiebeoperatoren

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

bitmuster schiebeoperatoren54
x << n und x >> n entsprechen einer Multiplikation mit 2n(bzw. Division durch 2n)

Der arithmetische Shift dient zur Bewahrung des Vorzeichens bei Divisionen einer negativen Zahl

Man beachte, dass (-1 >> 1) == -1, wogegen (-1/2) == 0

Der Ergebnistyp einer Schiebeoperation ist der Typ des linken (zu verschiebenden) Operanden

Der rechte Operand, der ganzzahlig sein muss, ist der Schiebezähler(shift count)

Für den Schiebezähler ist nur ein nicht-negativer Wert sinnvoll, der kleiner ist als die Anzahl der Bits im Typ des zu verschiebenden Wertes

Um dies sicherzustellen wird in Java der Wert des Schiebezählers automatisch entsprechend maskiert

Bitmuster: Schiebeoperatoren

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

ausdr cke
Ausdrücke
  • In Analogie zu mathematischen Termen kennen Programmiersprachen Ausdrücke(expressions) zur Repräsentation von Werten
    • Der Programmierer kann damit mathematische Formeln (wie z. B. sin(x)*sin(2*x)) direkt im Programm verwenden
    • Der Übersetzer erzeugt dann automatisch die Codesequenz zum Auswerten des Ausdrucks
      • Diese entspricht in etwa den Befehlen, die man in einem einfachen Taschenrechner ohne Klammerfunktion eingeben müsste
      • FORTRAN (Formula Translator) war Ende der 50er Jahre die erste Programmiersprache mit dieser Fähigkeit

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

ausdr cke56
Ausdrücke
  • Ausdrücke setzen sich zusammen aus
    • Literalen,
    • Konstanten-,
    • Variablen-,
    • Funktions- und
    • Operatorsymbolen
    • sowie Klammern als Hilfszeichen

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

ausdr cke57
Ausdrücke
  • Literalesind von der Programmiersprache vorgegebene Bezeichner für Werte
    • wie z.B. 1.0f für den Wert 1 vom Typ floatoder 0xFFfür ein bestimmtes Bitmuster vom Typ int
  • Konstanten- und Variablensymbolesind dagegen vom Programmierer frei gewählte andere Bezeichner für feste und für veränderliche Größen
    • final int eins = 1;führt den Bezeichner einsfür den Wert 1 vom Typ intein
  • Funktionssymbolebezeichnen programmiersprachliche Funktionen
    • Die anderswo ausprogrammiert sind, wie z. B. sin, cos, ...

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

ausdr cke operatoren
Ausdrücke: Operatoren
  • Operatorenbezeichnen spezielle in die Programmiersprache eingebaute Funktionen, die dadurch gegebenenfalls komfortablergeschrieben werden können
    • Etwa + * - /
    • Damit kann 1+2statt +(1, 2) geschrieben werden

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

ausdr cke operatorschreibweisen
Ausdrücke: Operatorschreibweisen
  • Folgende Operatorschreibweisen sind gebräuchlich:
    • Präfix: vorangestellt, z.B. unäres Minus –1
    • Postfix: nachgestellt, z.B. Postinkrement i++, mathematicher Ableitungsoperator f‘
    • Infix: in die Mitte gestellt, z.B. 1+2
    • Roundfix: drumherumgestellt, z.B. ein Klammernpaar als Operator aufgefaßt: (1+2) oder Mengenklammern {1, 3, 4}
    • Mixfix: in allgemeiner Form, z.B. unbestimmtes Integral  f(x) dx bestehend aus den Bestandteilen  und d des Operators

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

wohlgeformte ausdr cke
Wohlgeformte Ausdrücke
  • Ausdrücke müssen zunächst korrekt geschrieben werden
      • z.B. ist 1+-*2offensichtlich nicht korrekt
    • Sie müssen also syntaktisch korrekt sein
  • Man spricht hier auch von wohlgeformtenAusdrücken(well formed expressions)
  • Danach müssen Ausdrücke zu dem Wert evaluiert werden können, den sie bezeichnen sollen
    • Dies die Frage der Semantik, also der Bedeutung des Ausdrucks
    • Die Fragen von Syntax und Semantik sind für Programmiersprachen insgesamt von großer Bedeutung
      • Sie können anhand von Ausdrücken noch relativ einfach verdeutlicht werden

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

syntax von ausdr cken
Syntax von Ausdrücken
  • Rekursive Definitionsyntaktisch korrekterAusdrücke
    • (1) Jedes Literal, jede Konstante und jede Variable ist ein Ausdruck vom entsprechenden Typ
    • (2) Ist f: T1...... TnT eine Funktion, und sind A1, ...,An Ausdrücke jeweils vom Typ T1, ... ,Tn, so ist f(A1,...,An) ein Ausdruck vom Typ T
    • (3) Sei ein binärer Operator in Infixschreibweise vom Typ T1 T2T und seien A1 und A2 Ausdrücke jeweils vom Typ T1 und T2dann ist A1 A2 ein Ausdruck vom Typ T
      • Entsprechendes gilt für Operatoren anderer Stelligkeit und Schreibweise
      • Insbesondere ist (A) ein Ausdruck vom gleichen Typ wie A

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

syntax von ausdr cken62
Syntax von Ausdrücken
  • Die besondere Schreibweise, die bei eingebauten Operatoren möglich ist, kann zu mehrdeutigen Ausdrücken führen
    • 1+2*3könnte syntaktisch (gemäß den Regeln 1 bis 3 für die Konstruktion von Ausdrücken) sowohl als Ausdruck (1+2)*3als auch als 1+(2*3)gelesen werden
    • Damit die Semantik aber eindeutig wird, brauchen wir eindeutige Lesbarkeit
    • Um dies zu erreichen, misst man jedem Operator zunächst eine Bindungskraft(auch Vorrang, Präzedenz, precedence) einer gewissen Stufe bei
    • Wir sagen*bindet stärker als + und meinen damit, dass der Ausdruck als 1+(2*3)gelesen werden soll

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

syntax von ausdr cken63
Syntax von Ausdrücken
  • Präzedenzen von Java-Operatoren

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

syntax von ausdr cken64
Syntax von Ausdrücken
  • Mehrere Vorkommnisse von Operatoren gleicher Präzedenz (z.B. 1+2+3oder x=y=1) werden durch Angabe der Assoziativität(associativity) eindeutig lesbar:
    • Alle binären Operatoren sind links-assoziativ, außer den Zuweisungsoperatoren, die rechts-assoziativ sind
      • 1+2+3steht also für (1+2)+3, und x=y=1steht für x=(y=1)
    • Auch bei assoziativen mathematischen Operatoren wie +ist die eindeutige Lesbarkeit des programmiersprachlichen Ausdrucks wichtig
      • In f(1)+g(2)+h(3)könnten die Funktionen f, gundhnämlich Seiteneffekte auslösen (wie z.B. Ausgaben am Bildschirm), die von der Reihenfolge des Ausführung abhängig sein könnten
      • In Javaist daher strikte Evaluation von links nach rechts festgelegt

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

syntax von ausdr cken65
Syntax von Ausdrücken
  • Bemerkung: Die Entwickler von Programmiersprachen wählen die Operator-Präzedenzen im allgemeinen so, dass sich keine Überraschungen in der Semantik ergeben
  • Trotzdem sollte man bei Verwendung von weniger gebräuchlichen Operatoren die intendierte Semantik durch Klammerungeindeutig festlegen
  • Solche Semantik-Fehler sind nämlich sehr schwer zu finden, da das Programm syntaktisch korrekt ist und man beim Korrekturlesen den Fehler immer wieder überliest
    • Auch der Compiler gibt keine Fehlermeldung aus

Beispiel: Der Ausdruck (a & b == b & c)hat die Bedeutung von (a & (b==b)& c), da==stärker bindet als symmetrisches UND &

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

semantik von ausdr cken
Semantik von Ausdrücken
  • Jeder Ausdruck symbolisiert eine Berechnungsvorschrift und das entsprechende Ergebnis den Wert (value) des Ausdrucks
  • Semantik (Bedeutung) des Ausdrucks kann mehreres bedeuten …
    • Etwa die Berechnungsvorschrift
    • Den Wert
      • In welchem Bereich?
  • Operationale Semantik: Bedeutung eines Ausdrucks ist Berechnungsvorschrift
      • Formalisiert in Maschinenmodell
  • Denotationale Semantik
    • Bedeutung durch eine „semantische Abbildung“

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

semantik von ausdr cken67
Semantik von Ausdrücken
  • Semantische Abbildungm: AWvon der Menge der Ausdrücke in eine Menge von Werten
    • Werte können etwa Bitmuster sein
    • Oder auch (abstrakte) mathematische Objekte
      • Natürliche Zahlen, Ganze Zahlen, Reelle Zahlen  {, -, NaN},, …

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

semantik von ausdr cken68
Semantik von Ausdrücken
  • Ziel: Definition einer semantischen Abbildungm: AW von der Menge der Ausdrücke A in eine Menge von Werten W
    • Man folgt hierzu der rekursiven Definition der Syntax von Ausdrücken
    • Da Ausdrücke aus Literalen, Konstanten-, Variablen-, Funktions- und Operatorsymbolen bestehen, müssen wir zunächst diesen Symbolen individuell je einen Wert (also eine Bedeutung) geben
    • Der Wert des gesamten Ausdrucks ergibt sich dann wieder gemäß einer rekursiven Vorschrift aus den Werten der enthaltenen Symbole

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

semantik von ausdr cken69
Semantik von Ausdrücken
  • Rekursionsanfang
    • Nehmen als semantischen Bereich hier Menge von Bitmuster (vereinigt mit Zusatzsymbol)
      • Semantische Funktionen für LiteralemL: Ordne jedem Literal entsprechendes Bitmuster zu
        • Kann formal exakt definiert werden, soll hier nicht durchgeführt werden
      • Semantische Funktionen für VariablenmV: Ordne jeder Variablen Bitmuster ihres Wertes zu
        • Setzen voraus, dass schon belegt
          • Wirklicher „Rekursionsanfang“ nur möglich, wenn wir nicht nur einen Ausdruck betrachten 

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

semantik von ausdr cken70
Semantik von Ausdrücken
  • Semantik „eingebauter“ Operatoren und Funktionen
    • Funktionen wird kein Wert zugeordnet, sondern eine (mathematische) Funktion
      • Die Werte (oder Tupel von Werten) auf Werte abbildet
      • Nenne diese Zuordnung mF
        • Auch Operatoren werden auf entsprechende Funktionen abgebildet
          • Nenne diese Zuordnung mO
    • Für die Funktionen auf dem semantischen Bereich werden i.A. totale Funktionen genommen
      • Nehme etwa einen zusätzlichen Wert (traditionell mit  bezeichnet)
        • Damit auch Wert bei nicht-terminierenden Berechnungsvorschriften zuordenbar

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

semantik von ausdr cken71
Semantik von Ausdrücken
  • Rekursionsschritt

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

semantik von ausdr cken72
Semantik von Ausdrücken
  • Rekursionsschritt: Fall des Zuweisungsoperators
    • Zuweisungsoperator Sonderfall
    • Brauchen Menge der Zustände Z={ mV | mV ist eine Variablenbelegung}
      • Zustand ist eine Funktion mV die jeder Variable einen Wert zuordnet
    • Wert mO(=) des Zuweisungsoperators = eine Funktion f: Z W  W Z
      • Dem Zustand mV wird ein Zustandm‘V zugeordnet

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

semantik von ausdr cken73
Semantik von Ausdrücken
  • Beispiele

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

semantik von ausdr cken74
Semantik von Ausdrücken
  • Beispiele (Forts.)

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

typkonversionen
Typkonversionen
  • Bisher sind wir davon ausgegangen, dass alle Ausdrücke ganz genau typkorrekt aufgebaut sind
    • Wenn ein Operator oder eine Funktion ein Argument avom Typ Tverlangt hat, so haben wir auch lediglich Ausdrücke vom Typ Tfür aeingesetzt.
  • Dies ist das Grundprinzip stark typisierter Sprachen (strongly typed languages) wie Java: alle Ausdrücke haben (genau) einen Typ und sind typkorrekt aufgebaut
    • Allerdings ist diese Regel in dieser strengsten Form zu hinderlich
      • Strengste Form: genau ein Typ
      • Allgemeine Form: ein Typ
    • Beispiel:Sei int x = 2; long y;Der Ausdruck y = xist im strengsten Sinn nicht typkorrekt
      • Ausdruck 2+2L wäre auch nicht typkorrekt

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

typkonversionen76
Typkonversionen
  • Man möchte zumindest dort eine automatischeTypanpassung haben, wo dies wie im obigen Beispiel problemlos geschehen kann
  • Dies ist dann der Fall, wenn (wie bei intund long) ein Typ Sein Untertyp (subtype) eines (Ober-)Typs (supertype) O ist
    • In diesem Fall S  O kann jeder Wert vom Typ Sauch als Wert vom Typ Overwendet werden
      • Dieses Prinzip werden wir bei Klassentypen noch ausführlich diskutieren
      • Dort ist jede abgeleitete Klasse von einem Untertyp der Basisklasse. Z.B. ist ein Ventil ein spezielles Gerät und kann ohne jede Änderung überall dort eingesetzt werden, wo ein Gerät verlangt ist

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

typkonversionen77
Typkonversionen
  • Im Bereich der elementaren numerischen Typen in Java wird S als Subtyp von T angesehen, falls der Wertebereich (range) von Tgrößer ist als der von S
    • Ein numerischer Wert vom Typ S kann dann überall eingesetzt werden, wo ein T verlangt wird
    • Im Bereich der Ganzzahltypen ist byte  short  int  long
    • Außerdem erlaubt man die Benutzung eines char als Ganzzahl
    • Im Bereich der Gleitkommazahlen gilt float  double

Bedeutet hier „ist-subtyp“, nicht direkt „ist Teilmenge“

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

typkonversionen78
Typkonversionen
  • Aufgrund der Wertebereichsregel gilt auch long  float
    • Obwohl float eine geringere Anzahl signifikanter Bits speichert als long, so dass bei der Typkonversion Präzision(precision) verloren gehen kann
    • Im numerischen Fall haben wir also nicht eine reine Subtypstruktur wie im Fall der Klassentypen, sondern es besteht nur eine Ähnlichkeit

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

typkonversionen79
Typkonversionen
  • Ein int ist auch nichtim engeren Sinn ein spezielleslong, da ja 32 Bits in der Repräsentation fehlen
    • Allerdings ist es sinnvoll und nützlich, gegebenenfalls ein int zu einem longzu konvertieren, um einen Operator anwenden zu können
  • Wir sprechen dann von Typ-Aufweitung(type promotion)

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

typkonversionen80
Typkonversionen
  • Die Typ-Aufweitung ist in Java (und anderen Sprachen) nötig, da die arithmetischen Operatoren nur für Argumente gleichen Typs vorhanden sind
    • Außerdem gibt es unmittelbar auf byte, char und short keine arithmetischen Operatoren, da die meisten ProzessorenArithmetik nur auf int, long, float und double (jeweils für Werte gleichen Typs) unterstützen
  • Hat ein unärer arithmetischer Operator ein Argument vom Typ byte, char oder short, so wird dieses Argument mindestens zu intaufgeweitet

Für Java vor allem relevant: die JVM

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

typkonversionen81
Typkonversionen
  • Für zweistellige arithmetische Operatoren gilt:
    • Hat ein Operand den Typ double, dann wird der andere auf double aufgeweitet;
    • andernfalls wird auf float aufgeweitet wenn ein Operand vom Typ float ist;
    • andernfalls wird auf long aufgeweitet wenn ein Operand vom Typ long ist;
    • Andernfalls werden beide Operanden auf int aufgeweitet
  • Danach bezeichnet das Operatorsymbol die Operation des erweiterten Typs, und dies ist der Typ des Ausdrucks
    • Insbesondere werden dadurch arithmetische Ausdrücke über byte, char und short immer in entsprechende Ausdrücke mit Ergebnistyp int umgewandelt
      • integral promotion

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

typkonversionen82
Typkonversionen
  • Bemerkung:
    • Eine Ausnahme wird lediglich bei Definitionen von Variablen vom Typ byte oder short gemacht, da diese Typen keine Literaldarstellung von Werten haben
      • Falls auf der rechten Seite der Anfangszuweisung ein Ausdruck steht, dessen Wert statisch bestimmt werden kann und klein genug ist, so wird auf die Aufweitung verzichtet und der gefragte Typ angenommen

byte b=23;

short s=-1000;

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

typkonversionen83
Typkonversionen
  • Beispiele:
    • Der Typ von 1 + 1.0f ist float; der Typ von 1 + 1.0 ist double; der Typ von 1L + 1.0f ist float; der Typ von 1 + 1L ist long
    • Sei byte a,b,c; gegeben. Der Typ von a + b ist int ebenso wie der Typ von –b
      • Die Zuweisungen a = -b; und c = a + b; sind ungültig, da ein intnichtimplizit zu einem byteverengt werden darf (um vor unbewußten Fehlern zu schützen)
      • Gleichermaßen sind die Definitionen byte d = a + b; und byte d = -b;fehlerhaft

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

explizite typkonversionen
Explizite Typkonversionen
  • Neben den impliziten Typkonversionen sind auch explizite Typkonversionenmöglich
  • Hierzu gibt es den Konversionsoperator( type ) expr, der den Typ des Ausdrucks expr zu type umwandelt
  • Man spricht auch von Typerzwingung(type coercion, type cast)
  • Nicht jede Typkonversion kann vom Programmierer erzwungen werden
    • z.B. ist die Konversion von boolean nach int nicht möglich

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

explizite typkonversionen85
Explizite Typkonversionen
  • Explizite Typkonversion im wesentlichen sinnvoll bei einer Anpassung eines Obertyps O an einen Subtyp S
    • Also als Gegenrichtung zu der implizitenTypkonversion von S  O

ImpliziteTypkonversion

aufgrund einer Subtyp-Beziehung (meist eine injektive Funktion)

Explizite Typkonversion

(type cast); i.A. eine Funktion, die nicht injektiv ist oder auch nur eine partielle Funktion

S

O

Kann i.A. auch durch einen

type cast aufgerufen werden

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

explizite typkonversionen86
Explizite Typkonversionen
  • Allerdings kann man z. B. eine Typverengungin der arithmetischen Typhierarchie erzwingen
    • Abwärtskonversion, Down casting
  • Bei Ganzzahltypen werden die wegfallenden höherwertigen Bits einfach ausmaskiert
    • z. B. von int nach short
    • Hierbei kann sich ein positiver zu einem negativen Wert wandeln, wenn das Vorzeichenbit des engeren Typs zu Eins gesetzt wird
  • Bei der Abwärts-Konversion von double zu float kann z. B. Präzision verloren gehen oder es kann eine infinity entstehen
  • Bei der Konversion von Gleitkommatypen zu Ganzzahltypen entfallen die Nachkommastellen durch Rundung zur Null hin

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

explizite typkonversionen87
Explizite Typkonversionen
  • Beispiele:
    • int x = (int) 1L;
      • Der Wert 1 vom Typ long wird zum Wert 1 vom Typ int umgewandelt
    • char z = (char) 127;
      • Der Wert 127 vom Typ int wird zu einem Zeichenwert umgewandelt (der das DEL-Zeichen repräsentiert)
    • byte c = (byte) (a + b);
      • Der Ausdruck ist korrekt, da der Typ des Teilausdrucks (a + b) explizit von int zu byte umgewandelt wird
        • wodurch der Wert modulo 28 reduziert wird

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

explizite typkonversionen88
Explizite Typkonversionen
  • Beispiele (Forts.)

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

typkonversion bei geschachtelten ausdr cken
Typkonversion bei geschachtelten Ausdrücken
  • Sind bei geschachtelten Ausdrücken Typanpassungen vorzunehmen, so geschieht dies rekursiv von innen nach außen
    • Diese wohldefinierte Regel führt im Zusammenhang mit überladenen Operatoren manchmal zu überraschenden Ergebnissen, da für den Menschen eine Anpassung von außen nach innen oftmals „natürlicher“ erscheint und programmiersprachliche Ausdrücke entsprechend interpretiert werden

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

typkonversion bei geschachtelten ausdr cken90
Typkonversion bei geschachtelten Ausdrücken
  • Folgendes Beispiel führt in Java und C, C++ zu den gleichen (überraschenden) Ergebnissen

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

typkonversion bei geschachtelten ausdr cken91
Typkonversion bei geschachtelten Ausdrücken
  • Beispiele (Forts.)

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

typkonversion bei geschachtelten ausdr cken92
Typkonversion bei geschachtelten Ausdrücken

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

typkonversionen93
Typkonversionen
  • Bemerkung:
    • Problem taucht in C, C++ und Java im wesentlichen bei dem Operator / auf
    • Bei den anderen arithmetischen Operatoren +, *, - tritt es nicht in dieser Form auf
      • „Verträglichkeit“ der überladenen Operatoren mit der Abbildung, die durch implizite Typkonversion gegeben ist

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

anweisungen
Anweisungen

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

anweisungen95
Anweisungen
  • Eine Anweisung(statement) hat einen Effekt
  • Sie instruiert den Computer,
    • eine Berechnung vorzunehmen (expression statement),
    • eine Variable oder Konstante einzurichten und zu initialisieren (declaration statement) oder
    • eine Verzweigung oder Iteration im Programmfluss vorzunehmen (control flow statement)
  • Eine Anweisung wird (in Java) durch ein Semikolon ; abgeschlossen
  • Eine Java Anweisung kann grundsätzlich auch leer sein
    • Die leere Anweisung besteht nur aus dem abschließenden Semikolon oder aus einem Paar geschweifter Klammern { }

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

ausdrucks anweisungen
Ausdrucks-Anweisungen
  • Ausdrucksanweisungen(expression statement) bestehen aus einem Ausdruck, der durch ein Semikolonabgeschlossen ist
    • Hier sind aber nur bestimmte Ausdrücke zugelassen:
      • Zuweisungsausdrücke (mit = oder += etc.),
      • Präfix- oder Postfixformen von ++ oder --
      • Methodenaufrufe
      • Objekterschaffungen mit new

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

ausdrucks anweisungen97
Ausdrucks-Anweisungen
  • Das folgende sind Anweisungen:
    • i++;
    • int i=5;
    • x += 1;
    • System.out.print("hello");
    • Math.sin(Math.PI);
      • // Die Methode sin aus Klasse Math
      • // wird mit der Konstante PI aus Math aufgerufen

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

kontrollfluss anweisungen
Kontrollfluss-Anweisungen
  • Die Kontrollflussanweisungen zerfallen in
    • Blöcke(block)
      • Blöcke fassen durch Klammerung { } Anweisungssequenzen zu einer einzigen Anweisung zusammen
    • Verzweigungen(branch)
      • Verzweigungen veranlassen bedingte (if, switch) oder unbedingte (break, continue) Übergänge zu anderen Anweisungen im Kontrollfluss
    • Iterationen(Schleifen, loop)
      • Iterationen (while, do while, for) organisieren strukturierte Wiederholungen (Schleifen) im Kontrollfluss

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

bl cke
Blöcke
  • Eine Folge von Anweisungen kann zu einem Block(block) zusammengefasst werden
    • Der Block gilt dann logisch als eine einzige Anweisung
    • In C/C++ und Java ist ein Block gegeben durch ein Paar { ... } geschweifte Klammern und den eingeschlossenen Programmtext
    • Dies entspricht einer begin ... end Sequenz in der ALGOL-Familie
      • Pascal gehört zur Algol Familie
  • Der Block { } stellt die leere Anweisung dar
  • Blöcke können beliebig geschachtelt(nested) vorkommen, also z. B. {...{...}...}
    • Wir sprechen von Blockschachtelungmit äußeren(outer) und inneren(inner) Blöcken und der Blockschachtelungstiefe(nesting depth)eines Blocks

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

bl cke100
Blöcke
  • Moderne Programmiersprachen erlauben in jedemBlock die Deklaration von neuen Sprachobjekten (wie Variablen oder Klassen) durch Angabe eines Namens und eines Typs
  • Gleichzeitig beschränken sie die Gültigkeit eines Namens, so dass er lokalist für den Block, in dem er deklariert wurde
    • Dies hat vor allem wieder den Zweck der Kapselung von Information
    • Deklaration und Gebrauch von Namen sollen nahe beisammen liegen, und die Deklaration eines Namens soll nicht den ganzen globalen Namensraum belasten (namespace pollution)
    • Im allgemeinen können verschiedene Blöcke somit z. B. jeweils ihre eigene separate Variable i oder x haben, ohne sich gegenseitig abstimmen zu müssen
      • In Java gibt es eine Ausnahme, siehe später

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

bl cke101
Blöcke
  • Grundsätzlich können wir auch den Rumpf einer Klasse als Block ansehen
    • Siehe auch später
  • In diesem Block sind sowohl die Felder (Daten) der Klasse deklariert, als auch ihre Methoden (Funktionen)
  • Auch ein Funktionsrumpf ist ein Block:
    • Dort sind lokale Variablen deklariert
  • Jede Programmiersprache trifft Einschränkungen, welche Sprachobjekte in welcher Art von Blöcken deklariert werden dürfen
    • In Pascal kann z. B. ein Funktionsrumpf wieder eine Funktionsdeklaration enthalten
    • In C++ und Java geht dies nur bei Klassenrümpfen
    • In C können Funktionen nur im globalen Block auf der obersten Programmebene (entsprechend unserer Klasse Program) definiert werden

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

bl cke102
Blöcke
  • In Java dürfen auch Klassenrümpfe und sogar Funktionsrümpfe und andere Blöcke wieder Klassendeklarationen enthalten
    • Sogenannte nested classes oder inner classes
  • Funktionen können nur als Methoden von Klassen vorkommen
  • Jeder Rumpf einer Klasse bildet einen Block
    • die Funktionsrümpfe sind darin geschachtelte Blöcke
    • Schleifen bilden wieder neue Blöcke innerhalb von Funktionen
  • Nun stellen sich zwei Hauptfragen
    • Nach dem Gültigkeitsbereich(scope)für einen Namen
    • Nach der Lebensdauer(lifetime)des bezeichneten Objekts

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

bl cke103
Blöcke
  • Ein Name für ein Sprachobjekt ist an einem Ort gültig(valid), wenn er dort tatsächlich dieses Objekt bezeichnet
    • und kein anderes
  • In der Folge konzentrieren wir uns auf den Fall von Variablen
  • Eine Variable, die in einem Blockdeklariert wurde, ist dort eine lokale Variable

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

bl cke104
Blöcke
  • In C/C++ und Pascal ist der Gültigkeitsbereich(scope) eines zu Beginn eines Blockes deklarierten Namens der ganze Block
    • Mit der Ausnahme etwaiger inneren Blöcke, die eine erneute Deklaration des Namens (für ein anderes Objekt) enthalten
    • In den verschiedenen Programmiersprachen kann es unterschiedliche Ausnahmen geben, wenn man die Objekteam Typ unterscheiden kann
  • In Java ist eine erneute Deklaration eines Namens in einem inneren Block verboten, da dies manchmal zu schwer auffindbaren Fehlern führt
    • Wenn man den Überblick verliert, welche Deklaration gerade gilt
  • Allerdings ist in Java die erneute Deklaration eines Namens erlaubt, der schon ein Feld der umgebenden Klasse bezeichnet

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

bl cke105
Folgender Code ist in C/C++gültig, aber nicht in Java

Es gibt zwei verschiedene Blöcke mit zwei verschiedenen Variablen mit dem Bezeichner x

In C/C++ gilt folgendes:

Das x im äußeren Block hat durchgängig den Wert 1 (z.B. an Stelle2), das im inneren Block hat den Wert 2 (z.B. an Stelle 1)

Das x aus Deklaration 1 ist im inneren Block nicht gültig

An Stelle 1 bezeichnet x die Variable aus Deklaration 2, an Stelle 2 bezeichnet x die Variable aus Deklaration 1.

In Java ist der Code nicht korrekt, da die Deklaration 2 das x aus Deklaration 1verdeckt

Blöcke

{ int x = 1; // Deklaration 1

int y;

{ int x=2; // Deklaration 2

// OK in C/C++, Fehler in Java

y=x; // Stelle 1

}

y=x; // Stelle 2

}

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

bl cke106
Folgender Code ist sowohl in C/C++ als auch in Javagültig

In Block 1.1 und Block1.2 existieren (zu verschiedenen Zeiten) zwei verschiedene Variablen, die beide den Nameny haben

Blöcke

{ int x; // Block 1

{int y=1; // Block 1.1

x=y;

// ...

}

{int y=2; // Block 1.2

// ...

}

}

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

bl cke107
Blöcke
  • Bei Variablen ist nicht nur der Namelokal zum Block, in dem sie deklariert sind, sondern auch der Speicherplatz
  • Eine Variablelebt genau so lange, wie für sie Speicherreserviert ist
  • Die Lebensdauer(lifetime) einer in einem Block deklarierten Variablen ist die Zeit vom Eintreten des Kontrollflusses in den Block bis zum Austreten aus dem Block
    • Einschließlich des Verweilens in inneren Blöcken

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

bl cke108
Blöcke
  • Jedem Block entspricht ein Speicherbereich (Rahmen, frame) auf dem Laufzeitstapel(run-time stack)
    • Dort sind die Werte der lokalen Variablen abgelegt
  • Bei jedem Eintreten in den Block wird der zugehörige Rahmen zuoberst auf dem Laufzeitstapel angelegt(allocate)
    • Er verbleibt dort solange, bis der Kontrollfluss den Block verlässt
      • Worauf der Rahmen wieder entfernt wird
  • Jeder lokale Variablenname wird mit einer Adresse in diesem Speicherblockverbunden
    • Damit dies einfach geht ist jede Referenz einer lokalen Variablen bereits als Versatz (offset) relativ zu einer zur Übersetzungszeit noch unbestimmten Anfangsadresse angegeben
    • Für jeden neuen Block wird diese Basisadresseneu bestimmt und oft in einem Basisadressregistergespeichert

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

bl cke109
Blöcke
  • Tritt der Kontrollfluss in einen inneren Block ein, so kommt der Rahmen des inneren Blockes im Stapel auf den Rahmen des äußeren zu liegen
  • Bei einem rekursiven Eintreten in denselben Block wird erneut ein Rahmen zuoberst auf den Stapel gelegt und jede (lokale)Variable erfährt eine neue Inkarnation
    • indem ihr Name an einen neuen Speicherplatz gebunden wird (vgl. rekursive Prozeduren später).
  • Das Binden(linking) einer Referenz an einen Namen kommt auch nach der Übersetzung vor, wenn die Startadressen von Bibliotheksfunktionen an die Namen von externen Funktionsaufrufen gebunden werden (sog. external linking)

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

bl cke110
Blöcke
  • Eine Variable, die auf dem Laufzeitstapel angelegt wird, heißt auch dynamische Variable
    • da ihre Speicherstelle erst zur Laufzeit bestimmt wird
    • Ihre absolute Adresseerhält man nur über eine Adressrechnungzur Laufzeit
      • Die Adressrechnung steht in C/C++ dem Programmierer auch explizit zur Verfügung, in Java kann er eine solche nicht direkt durchführen
    • In C gibt es auch statische Variablen, die zur Übersetzungszeit in einem festen globalen Speicherbereich angelegt werden und die daher keine Adressrechnung brauchen
    • Diese haben eine unbegrenzte Lebensdauer und behalten ihre Werte zwischen Prozeduraufrufen
  • Java verwendet die Begriffe statisch und dynamisch analog für Felder, die entweder nur eine absolute Adresse in der Klasse haben oder in jedem Objekt eine andere

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

bl cke111
Blöcke
  • Der Stapelspeicher(stack) pulsiert also im Takt des Abarbeitens von Blöcken
    • Werte, die in einem inneren Block gespeichert sind, gehen nach Ende des Blocks verloren
    • Sie können gerettet werden, indem sie noch im inneren Block an eine Variable eines äußeren Blocks zugewiesen werden
    • Bemerkung: Das Prinzip des Stapelspeichers und Prinzipien der Werteübergabe werden wir am Beispiel von Unterprogrammen (Prozeduren, Funktionen) noch ausführlich diskutieren

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

bl cke112
Bild des Stapelspeichersbeim Durchlaufen des Codes aus obigem Beispiel (nochmals unten angegeben)

Es hat sich im Bereich der Systemprogrammierung eingebürgert, Stapelspeicher als nach unten wachsend zu zeichnen

Die Rahmen der inneren Blöcke werden unter den Rahmen des äußeren Blocks gezeichnet

Blöcke

{ int x; // Block 1

{int y=1; // Block 1.1

x=y;

// ...

}

{int y=2; // Block 1.2

// ...

}

}

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

bl cke113
Blöcke
  • Der Haldenspeicher (Halde, heap) auf dem alle mit new erzeugten Klassenobjekte gespeichert werden, kennt dagegen keine Rahmen und pulsiert nichtim Takt der Abarbeitung von Blöcken
  • Das Objekt auf der Haldelebt weiter, auch wenn die entsprechende Referenzvariable vom Stapel verschwindet
    • Gibt es auf das Objekt keine gültige Referenz mehr, so kann es vom garbage collector gelegentlich eingesammelt und sein Speicherbereich recycled werden
  • Es ist insbesondere möglich, die Referenz auf das Haldenobjekt an eine Variable in einem äußeren Blockzuzuweisen und damit nach draußen (außerhalb des Blocks) weiterzugeben

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

bl cke halde und stapel
Blöcke: Halde und Stapel
  • Nochmals zur Erinnerung:
    • 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 -114- Springer-Verlag, ISBN 3-540-20958-1

bedingte anweisungen
Bedingte Anweisungen

Die einfache if-Anweisung hat die Form

if (condition) statement

Die allgemeine if-Anweisung hat die Form

if (condition) statement1else statement2

Dabei ist conditionein Boolescher Ausdruck. Falls condition zu true

evaluiert, wird statement1 ausgeführt, sonst statement2. Jedes statement

ist eine Anweisung, also evtl. auch ein Block oder wieder eine if-Anweisung, oder die leere Anweisung etc.

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

bedingte anweisungen116
Bedingte Anweisungen

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

bedingte anweisungen117
Bedingte Anweisungen
  • Eine weitere Möglichkeit einer bedingten Anweisung ist die Fallunterscheidung:

Nur Konstanten erlaubt

Die break-Anweisung am Ende jeder case-Zeile bewirkt das sofortige Verlassen der switch-Anweisung. Falls das break am Ende der Zeile fehlt, wird die nachfolgende case-Zeile getestet und bei Zutreffen auch ausgeführt.

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

bedingte anweisungen118
Beispiele (1):Bedingte Anweisungen

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

bedingte anweisungen119
Bedingte Anweisungen

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

schleifen anweisungen
Schleifen-Anweisungen

Das Konstrukt

while (condition)statement

führt statement aus, solange der Ausdruck

in condition zu true evaluiert.

Oftmals wird es sich bei statement um

einen Block handeln.

Die Anweisung

dostatement while (condition)

führt statement aus und prüft danach durch Auswertung von condition, ob der Schleifendurchgang wiederholt werden soll.

Bei do-Anweisungen ist

statement fast immer ein Block.

Die Anweisung

dostatement while (!condition)

entspricht dem Konstrukt

do statement until (condition)

in anderen Sprachen.

repeat

in Pascal

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

schleifen anweisungen121
Schleifen-Anweisungen

Bem.: dies ist äquivalent zu

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

schleifen anweisungen122
Schleifen-Anweisungen
  • Eine Variable, die wie i in obigem Beispiel mit den Schleifendurchgängen „mitläuft“ und in die Abbruchbedingung eingeht, heißt auch Schleifenvariable(loop variable) oder Laufvariable
    • Die Verwendung solcher Variablen ist für Schleifen typisch
    • Im allgemeinen gehen sie in die Schleifen-Invariante ein.

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

schleifen anweisungen123
Schleifen-Anweisungen

Die Anweisung

for (init ; condition ; increment) statement

entspricht

{init ; while(condition) {statement ; increment ; } }

Spezielle Syntax, da häufig vorkommend

{ int i;

int res = 0;

i = 1;

while ( i < 10 ) {

res = res + i;

i++;

}

}

{ int i ;

int res = 0;

for (i=1; i < 10; i++ ) {

res = res + i;

}

}

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

schleifen anweisungen124
Schleifen-Anweisungen
  • Sowohl initals auch incrementdienen vor allem zur Manipulation der Laufvariablen
  • Der init-Teil kann die Deklaration einer Variablen, z. B. der Laufvariablen, enthalten
    • Diese Variable ist dann im Rumpf der for-Schleife lokal
  • Der increment-Teil kann aus einer durch Kommata getrennten Liste von Ausdrücken bestehen, die von links nach rechts evaluiert werden
    • Dadurch besteht oft die Alternative, Code entweder im Schleifenrumpf oder im Kopf unterzubringen
    • Der Kopf sollte immer den Code enthalten, der die Kontrolle über die Schleifendurchgänge behält; der Rumpf sollte die eigentlichen Arbeitsanweisungen enthalten
  • Jeder der drei Teile in einer for-Anweisung kann auch leer sein und zum Beispiel durch ein entsprechendes Konstrukt im Schleifenkörper ersetzt werden.

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

schleifen anweisungen125
Schleifen-Anweisungen
  • Beispiele für „guten“ und „schlechten“ Programmierstil

Guter Stil

Syntaktisch korrekt

Schlechter Stil

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

schleifen anweisungen126
Schleifen-Anweisungen
  • Eine Endlosschleife erhält man durch folgende for-Schleife:for ( ; ; ) { // forever}
  • Dies ist ein idiomatischer Ausdruck, d. h. von den vielen Arten, eine Endlosschleife zu erzeugen, wählt man in Java (und in C/C++) per Konvention immer diese (und kommentiert mit // forever, dass es Absicht war)
  • Die Schleife kann evtl. durch Anweisungen im Rumpf (etwa break oder return) doch noch abbrechen

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

schleifen anweisungen127
Schleifen-Anweisungen
  • Beispiel (Drucken eines Bitmusters)
    • Wir betrachten zwei verwandte Lösungen für das Problem, das zu einer auf der Kommandozeile angegebenen Ganzzahl gehörende Bitmuster auszugeben.
    • Wir drucken nacheinander die Bits 31 bis 0 einer Zahl z
    • Zur leichteren Lesbarkeit sollen die Bytes jeweils durch einen Punkt separiert werden
    • Wir verwenden eine Maske, in der nur das zu druckende Bit auf 1 gesetzt ist

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

schleifen anweisungen128
Schleifen-Anweisungen
  • Beispiel (Drucken eines Bitmusters, Forts.)

// (1) Initialize

int z = Integer.parseInt(args[0]);

int mask = 01 << 31;

// (2) Print masked bit and shift

for (int i = 31; i >= 0; i--) {

if ( (z & mask) != 0) System.out.print(`1`);

else System.out.print(`0`);

if ((i%8 == 0) && mask != 1) System.out.print(`.`);

mask >>>= 1;

}

// (3) Finalize

System.out.println();

int z = Integer.parseInt(args[0]);

int i = 31;

for (int mask = 01 << 31; mask != 0;

mask >>>= 1, i = (i-1)%8) {

char c = ((z & mask) != 0) ? `1` : `0`;

System.out.print(c);

if ((i == 0) && (mask != 1))

System.out.print(`.`);

}

System.out.println();

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

schleifen anweisungen129
Schleifen-Anweisungen
  • Weiteres Beispiel: Maximum eines Array

Die folgende Schleife berechnet

das Maximum der Werte eines

Array ader Länge u

float max = a[0];

for (int i=1; i < u; i++)

if (a[i] > max) max = a[i];

int u=5;

float[] a = new float[u];

Invariante: max = Maximum(a[0..i-1])

Bem.: Mit a.length erhält man die Länge des Reihungsobjektes a. Die Schleifensteuerung der Art

for (int i=0; i < a.length; i++)

ist dann ebenfalls idiomatisch. Auf diese Weise kann man die Länge der Reihung explizit verwenden und braucht keine separate Variable, in der diese gespeichert ist.

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

schleifen anweisungen130
Schleifen-Anweisungen
  • Weiteres Beispiel: Erstellen eines Bitmusters
    • Wir fertigen uns ein Bitmuster an, indem wir in einer Reihung die Positionen angeben, die im Muster mit 1 belegt sein sollen
      • Die Reihung geben wir in Literaldarstellung direkt im Programm an

int[] bitPosition = new int[] {0, 1, 23, 27, 31};

int res = 0;

for (int i = 0; i < bitPosition.length; i++)

res |= (01 << bitPosition[i]);

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

labels break und continue
Labels, break und continue
  • Jedes Statement kann markiert werden:
    • label : statement
    • Sinnvoll i.d.R. nur bei Blöcken, Schleifen
  • In Java: kein allgemeiner Sprung „gotolabel“
  • Aber möglich in Java:
    • Sprung ans Ende eines Blocks
    • Sprung an Beginn oder ans Ende einer Schleife
    • Sprung aus einer Methode zurück an die aufrufende Methode

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

labels break und continue132
Labels, break und continue
  • Unlabeled break statement: break;
    • beendet die unmittelbar umgebende switch-, while-, do- oder for-Anweisung
  • Labeled break statement:break label;
    • beendet die umgebende mit label gekennzeichnete Anweisung

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

labels break und continue133
Labels, break und continue
  • Beispiel: Teste, ob in jeder Zeile des 2D-Arrays a alle Werte positiv sind:

label

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

labels break und continue134
Labels, break und continue
  • Unlabeled continue statement: continue;
    • transferiert Kontrollfluss einer Iterationsanweisung zur nachfolgenden Iteration
    • nur in while-, do-, for-Anweisungen
  • Labeled continue statement: continue label;
    • transferiert Kontrollfluss einer Iterationsanweisung zur nachfolgenden Iteration der mit dem Label gekennzeichneten Schleife
  • Markierte break- und continue-statements nützlich, wenn mehrere Schleifenebenen gleichzeitig betroffen sein sollen

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

labels break und continue135
Labels, break und continue
  • Beispiel: Wir testen, ob die zweidimensionale Reihung a in jeder Zeileeinen positiven Wert enthält

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

unterprogramme prozeduren und funktionen
Unterprogramme - Prozeduren und Funktionen

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

unterprogramme prozeduren und funktionen137
Unterprogramme, Prozeduren und Funktionen
  • Wir benutzen Unterprogramm als sprachneutralen abstrakten Sammelbegriff für Prozedur und Funktion
    • Java unterstützt Funktionen und verwirklicht nur spezielle Formen der allgemeinen Konzepte

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

unterprogramme
Unterprogramme
  • Ein Unterprogrammist ein parametrisierterAnweisungsblock mit einem Namen
  • Der Anweisungsblock heißt Rumpf(body) des Unterprogramms
    • Besteht aus einem Block, der die Berechnungsvorschrift als Anweisungssequenz enthält
  • Vor dem Rumpf steht der Kopf(head, header)
    • Enthält Namendes Unterprogramms sowie Namen und Typen der Parameterund den etwaigen Ergebnistyp
    • Die im Kopf deklarierten Parameter heißen genauer formale Parameterund gelten im Rumpf als lokale Variablen

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

unterprogramme139
Unterprogramme
  • Der Block kann mit passenden aktuellen Parameternüber seinen Namenaufgerufen(call) werden
    • Dann werden an der Stelle des Aufrufs die Anweisungen des Unterprogramms ausgeführt
    • Dabei haben die formalen Parameter jetzt Werte, die sich aus den aktuellen Parametern ergeben haben
    • Am Ende wird der Aufruf durch das berechnete Ergebnis ersetzt
    • Anschließend fährt die Berechnung mit der nächsten Anweisung nach dem Aufruf fort

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

unterprogramme prozeduren und funktionen140
Unterprogramme, Prozeduren und Funktionen
  • Wir betrachten ein Java-Unterprogramm zur Berechnung der ersten Glieder der harmonischen Reihe
  • Schleifeninvariante ist

i

Bem.: die äquivalente Standardform ist

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

unterprogramme141
Unterprogramme

Parameter-Übergabe

  • Unterprogramm-Aufruf durch strukturierte vom Compiler implizit generierte Sprünge (Einsprung / Rücksprung)
  • Compiler legt neuen Block auf Laufzeit-Stack an um lokale UP-Variablen zu speichern (activation record)
  • Parameter-Übergabe durch vom Compiler implizit generierte Zuweisungen

double x;

int n=5;

x = harm(n);

double

harm(int k) {

double res = 0.0;

int i = 1;

while (i <= k) {

res += 1.0/i;

i++;

}

return(res);

}

Einsprung

x = x * x;

// …

System.out.print(x);

// …

Rücksprung

Ergebnis-Rückgabe

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

unterprogramme142
Unterprogramme
  • Das allgemeine (über Java hinausgehende) Konzept des Unterprogramms erlaubt zudem beliebig viele Rückgabewerte (speziell auch keinen), sowie verschiedene Mechanismen zur Übergabe von Parametern und Rückgabewerten
  • In objektorientiertenSprachen treten Unterprogramme als Methoden von Klassen auf
    • Für jede Klasse werden einmal die zugehörigen Methoden programmiert und dann auf einzelnen Objekten immer wieder aufgerufen
      • d. h. jeder Methodenaufruf hat einen impliziten Parameter, nämlich das Objekt„auf“dem die Methode ausgeführt wird.
  • Innerhalb eines Unterprogramms können wiederum weitere Unterprogrammaufrufe stehen
    • Wird innerhalb von P wiederum P selbst aufgerufen, so spricht man von einem rekursivenAufruf (recursive call)
    • Ruft P ein Q und Q wiederum ein P auf, so spricht man von einem verschränktrekursiven Aufruf(mutually recursive call)

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

unterprogramme143
Unterprogramme
  • Wie in jedem Block können auch in Unterprogrammen lokale Variablen(local variables) zur Speicherung von Zwischenergebnissen vereinbart werden
    • Die formalen Parameter(formal parameters) sind ebenfalls lokale Variablen im Rumpf
      • Sie erhalten bei jedem Aufruf neue Werte, die sich aus den aktuellenParametern(actual parameters) ergeben
      • Die genaue Art und Weise, wie dies geschieht, ist durch den jeweiligen Mechanismus der Parameterübergabe(parameter passing) bestimmt
        • Hier stehen Werte-, Referenz- und Namensübergabe zur Auswahl, die wir später noch genauer untersuchen
  • Die aktuellen Parameter können i. a. durch Ausdrücke gegeben sein
    • Wie 2*a oder sin(sin(a+x))

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

unterprogramme prozeduren und funktionen144
Unterprogramme, Prozeduren und Funktionen
  • Beispiel (Drucken eines Bitmusters): Wir können die Programmstücke zum Drucken von Bitmustern aus dem Beispiel weiter oben verpacken, indem wir
    • einen geeigneten Kopf hinzufügen
    • und die zu konvertierende Zahl als Parameter übergeben, statt sie von der Kommandozeile einzulesen
      • Bem.: Wir tun dies hier am Beispiel einer extrem kompakten Programm-Variante, die auf das Drucken der Punkt-Separatoren verzichtet
      • In Java zeigt das Schlüsselwort void an, dass das Unterprogramm kein Ergebnis berechnet

void printBitPattern(int z) {

for (int mask = 01 << 31; mask != 0; mask >>>= 1) {

System.out.print(((z & mask) != 0) ? `1` : `0`);

}

System.out.println();

}

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

unterprogramme und generisches programmieren
Unterprogramme und generisches Programmieren
  • Erst durch die Parameter erhält das Unterprogrammkonzept seine große Mächtigkeit und fundamentale Bedeutung
  • Wir haben hier einen ersten Schritt in Richtung generischesProgrammieren(generic programming) getan, da wir ein einmal geschriebenes Stück Programmtext in wechselnden Kontexten wieder verwenden können
    • Dabei sind sich alle Rechnungen jeweils ähnlich, aber im Detail doch verschieden
    • Wir kehren später in der Vorlesung nochmals auf einer höherenAbstraktionsebene zum Konzept des generischen Programmierens zurück
      • Dann können nicht nur verschiedene Parameter des gleichen Typs verwendet werden, sondern das Programmstück gilt auch für verschiedene Typen

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

unterprogramme und funktionen
Unterprogramme und Funktionen
  • Berechnet das Unterprogramm einen Rückgabe-Wert(return value), so sprechen wir von einer (programmiersprachlichen) Funktion(function)
    • Der Rückgabewert wird durch einen Ausdruck festgelegt, der das Unterprogramm beendet
      • Zum Beispiel: return expr;
    • Der Wert von expr ist dann der Wert des Funktionsaufrufs
  • Auf diese Weise können mathematische Funktionen realisiert werden und Funktionsaufrufe können sinnvoll in Ausdrücken eines Aufrufs vorkommen

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

unterprogramme und funktionen147
Unterprogramme und Funktionen
  • Eine Funktion wird aufgerufen (call), indem man den Namen, gefolgt von einer Liste aktueller Parameterwerte, angibt
    • z.B. f(x, 1, a*b) oder sin(PI/2)
  • Die Berechnung tritt dann in die Funktion ein, deren formale Parameter die beim Aufruf angegebenen aktuellen Parameter als Werte bekommen
  • Wie immer in einem Block werden die lokalen Variablen (also auch die Parameter) in einem zugehörigen Rahmen auf dem Laufzeitstapel gespeichert (activation record)

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

unterprogramme und funktionen beispiele
Unterprogramme und Funktionen: Beispiele
  • In der Zuweisungdouble y = sin(x) + sin(2*x) kommen 2 Funktionsaufrufe als Teilausdrücke vor
    • Der Wert vonsin(x) ist der Rückgabewert des mit sin bezeichneten Unterprogramms
      • Wenn es mit (dem Wert von) x als aktuellem Parameter versorgt wird
    • Der durch sin bezeichnete Block wird zweimal ausgeführt, einmal mit x als aktuellem Parameter und einmal mit 2*x als aktuellem Parameter

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

unterprogramme und funktionen beispiele149
Unterprogramme und Funktionen: Beispiele
  • (Erstellen eines Bitmusters) Das in einem weiter vorne angegebenen Programmstück zur Erzeugung eines Bitmusters kann in ein Unterprogramm mit Ergebnis verpackt werden
  • Damit kann ein Bitmuster erzeugt und ausgedruckt werden in dem die Bits 0, 23 und 31 auf „1“ gesetzt sind
  • printBitPattern(composeBitPattern(new int[] {0, 23, 31}));

int composeBitPattern ( int[] bitPosition ) {

int res = 0;

for (int i = 0; i < bitPosition.length; i++)

res |= (01 << bitPosition[i]);

return (res);

}

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

eingabeparameter ausgabeparameter transiente parameter
Eingabeparameter, Ausgabeparameter, Transiente Parameter
  • Reinen Funktionen werden als aktuelle Parameter nur völlig ausgewertete Ausdrücke übergeben
  • Formale Parameter, deren Zweck nur in der Übernahme von aktuellen Werten besteht, heißen (reine) Eingabeparameter(input parameter)
  • Dagegen erlauben es Ausgabeparameter(output parameter), die (außerhalb gespeicherten) Werte von (Ausgabe-)Variablen zu verändern, deren Referenzen als aktuelle Parameter übergeben werden
  • Transiente Parameter(transient parameter) dienen als Eingabe- und Ausgabeparameter

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

prozeduren funktionen mit seiteneffekten
Prozeduren, Funktionen mit Seiteneffekten
  • Unterprogramme, die keinen Wert zurückliefern, sondern Ausgabevariablen verändern, heißen auch Prozeduren(procedure)
  • Eine Funktion, die gleichzeitig Ausgabeparameter benutzt, heißt Funktion mit Seiteneffekt(side effect)
  • Das allgemeine Unterprogramm repräsentiert die Berechnung eines Bündels von mathematischen Funktionen, die die Eingabewerte jeweils auf einen der Ausgabewerte abbilden

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

prozeduren und funktionen
Prozeduren und Funktionen
  • Kopf eines allgemeinen Unterprogramms
    • Allgemeiner als Java

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

signatur eines unterprogramms
Signatur eines Unterprogramms
  • Name, sowie Anzahl und Reihenfolge der Parameter und ihrer Typen und evtl. der Typ des Resultates bilden die Signatur(signature) des Unterprogrammes
    • Wir sprechen auch von der Aufrufschnittstelle(call interface)
  • Die Signatur gibt die Syntax des Aufrufs wieder
    • Sie wird im Kopf des Unterprogrammes festgelegt
  • Im allgemeinen können Unterprogramme anhand ihrer Signatur unterschieden werden
    • Auch wenn sie gleiche Namen haben
    • Wir sprechen dann vom Überladen(overloading) des Namens

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

unterprogramme in java
Unterprogramme in Java
  • In Java einfache Funktionsform im allgemeinen ausreichend
    • Result_t f(Te1 e1, . . . ,Tem em)
      • Result_t kann ja Verbund sein, in dem evtl. mehrere Ausgabewerte gebündelt werden
  • In Java kommen Funktionen ausschließlich als Methoden von Klassen vor
    • In C++ gibt es sowohl Methoden als auch Funktionen (wie in C)
  • „Gewöhnliche“ Funktionen können in Java sehr gut durch static Methoden dargestellt werden

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

unterprogramme in java155
Unterprogramme in Java
  • Beispiel (Rahmen für Funktionen)

public class ProgramF {

public static

int plus(int a, int b) {

return (a+b);

}

public static void main(String[] args) {

int x=5;

int y=6;

int z, v;

z=plus(x,y);

System.out.println(x + " + " + y + " = " + z);

v=plus(plus(x,y),z);

System.out.println(x + " + " + y + " + " + z + " = " + v);

}

}

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

signaturen von funktionen
Signaturen von Funktionen
  • Für Signatur einer Java-Funktion
    • Nur Name sowie Reihenfolge und Typ der Parametermaßgebend
    • Zwei Java-Funktionen können sich nicht lediglich durch ihren Resultattyp unterscheiden
  • Funktionsnamen können überladen werden
    • Es kann mehrere Funktionengleichen Namens aber unterschiedlicher Signatur geben

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

signaturen von funktionen157
Signaturen von Funktionen
  • Beispiel
    • Im Beispiel ProgramF schon definiert Funktion mit Signatur
      • plus: int × int  int
    • Können weitere Funktion namens plus mit folgender Signatur definieren
      • plus: float × float  float
    • Nicht zulässig weitere Funktion plus mit folgender Signatur
      • plus: int × int  float

public static int plus(int a, int b) {

return (a+b);

}

public static float plus(float a, float b) {

return (a+b);

}

public static float plus(int a, int b) {

return (float) (a+b);

}

Nur Resultattyp verschieden

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

parameter bergabe
Parameterübergabe
  • Es gibt mehrere Verfahren für Substitution der aktuellen Parameter für die formalen Parameter
    • Werteaufruf (call by value)
    • Referenzaufruf (call by reference)
    • Namensaufruf (call by name)

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

parameter bergabe159
Parameterübergabe
  • Werteaufruf (call by value)
    • Aktueller Parameterai wird ausgewertet
    • Wert wird formalem Parameter eizugewiesen
      • Entspricht einer Zuweisungei = ai;
      • Grundlegender Mechanismus bei praktisch allen Programmiersprachen
        • Java, C, C++, FORTRAN, Pascal, …
    • Das Unterprogramm kann also nicht als Seiteneffekt den Wert des aktuellen Parameters außerhalb ändern
      • man kann den Wert des formalen Parameters innerhalb des Unterprogramms beliebig verändern, ohne dass sich der Wert des aktuellen Parameters außerhalb ändert.
      • Es werden keine Seiteneffekte nach außen sichtbar

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

parameter bergabe160
Parameterübergabe
  • Referenzaufruf (call by reference)
    • Aktueller Parameter ist Variable (im Unterprogramm)
      • Zulässig jeder Ausdruck, der einen Linkswert hat
        • Z.B. also auch indizierte Variable wie a[i+5]
      • Linkswert wird für den Linkswert des formalen Parameters eingesetzt
      • Formaler Parameter wird ein alias für den aktuellen Parameter
        • Wert des aktuellen Parameters wird also nicht kopiert, sondern formaler Parameter verweist auf die Stelle wo der Wert (außerhalb) steht.
      • Zuweisungen an den formalen Parameter innerhalb ändern also unmittelbar den Wert des aktuellen Parameters außerhalb
    • In Javanicht direkt verwendet
      • Für Objekte wird eine eingeschränkte Variante verwendet
        • Siehe unten

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

parameter bergabe161
Parameterübergabe
  • Referenzaufruf (Forts.))
    • Unterstützt in C++ oder Pascal („var“-Parameter)
    • Bei Referenzaufruf kann Kopieren großer Strukturen vermieden werden
      • Etwa großer Arrays
      • In C++ kann syntaktisch gekennzeichnet werden, ob aktueller Parameter im Unterprogramm geändert werden kann oder nicht
    • Kann in C simuliert werden
    • Für Objekte (und Reihungen) wird in Java Variante verwendet

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

parameter bergabe162
Parameterübergabe
  • Namensaufruf (call by name)
    • Aktueller Parameter ist beliebiger Ausdruck
    • Wird ohne Auswertung für den formalen Parameter textuell substituiert
    • Ausdruck wird im Kontext des Unterprogramms immer dort evaluiert, wo der formale Parameter vorkommt
      • Verwendung im l-Kalkül
        • Und funktionalen Sprachen wie etwa LISP
        • Auch in ALGOL 68 konnte Namensaufruf verwendet werden
  • Wird von Java, C++, Pascal etc. nicht unterstützt
    • technisch kompliziert, praktisch weniger wichtig, historische und theoretische Bedeutung

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

parameter bergabe163
Parameterübergabe
  • Beispiel: Effekte der Übergabemechanismen auf die Reihung a beim Prozedur-Aufruf p(a[i])

Werte-Aufruf:Zu Beginn von p wird implizit die Zuweisung x = 10 ausgeführt. Dann wird das Feld i in Program inkrementiert und die lokale Variablex in p um 2 erhöht, was auf a[0]keine Auswirkungen hat. Es wird 10und 20 ausgegeben.

Referenz-Aufruf(in Javanicht möglich): Nun istx ein alias für a[0], wir können im Programm nun auch a[0] lesen wo x steht. Es wird in p also a[0] =a[0]+2; ausgeführt und 12 und 20 ausgegeben.

Namens-Aufruf (in Javanicht möglich): In p wird x textuell durch a[i] ersetzt. Dadurch wird a[i] = a[i] + 2; in p ausgeführt. Es wird 10 und 22 ausgegeben.

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

parameter bergabe und laufzeitstapel
Parameterübergabe und Laufzeitstapel
  • Speicherbild beim Ablauf einer einfachen Funktion in Java, C/C++

Benötigte Verwaltungsgrößen

Statischer Verweis(static link) auf den Rahmen, in dem globale Variablen gespeichert sind (genauer: die Variablen des Blocks, in dem die Prozedur deklariert wurde).

Dynamischer Verweis(dynamic link) auf den Rahmen der Prozedur-Inkarnation, aus der der gegenwärtige Prozeduraufruf getätigt wurde. Das ist immer der Rahmen direkt unterhalb auf dem Stapel.

Die Rücksprungadresse(return address) spezifiziert die Anweisung, mit der die

Berechnung nach Beendigung des Unterprogramm-Aufrufs fortfährt.

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

parameter bergabe und laufzeitstapel werteaufruf
Parameterübergabe und Laufzeitstapel: Werteaufruf

Der Einfachheit halber seinen die aktuellen Parameter Variablen im Block des Vaters. Die formalen Parameter sind lokale Variablen im Block des Sohnes. Bei der Werteübergabewerden die Werte der aktuellen Parameter (Ausdrücke oder Variablen) im Kontext des Vaters ermittelt und dann vom Vater zum Sohn kopiert. Dies geschieht in einem vom Übersetzer automatisch erzeugten Zuweisungsblock vor dem eigentlichen Beginn der Sohn-Prozedur.

Te1 e1 = a1;

...

Tem em = am;

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

parameter bergabe und laufzeitstapel werteaufruf166
Parameterübergabe und Laufzeitstapel: Werteaufruf
  • Nach Beendigung des Unterprogramms werden die lokalenVariablenaufgelöst und der Speicherrahmenfreigegeben
  • Die Werte der formalen Parameter werden nichtan die aktuellen Parameter zurück überwiesen, falls Werteübergabe vereinbart war
    • Dieser Fall gilt grundsätzlich für C und Java
  • Diese Übergabetechnik kann im Prinzip aber ebenso in umgekehrter Richtung auf Ausgabeparameter angewendet werden
    • Im früher für FORTRAN verwendeten Mechanismus der Werte- undResultatsübergabe(call by value and result) werden beim Austritt aus der Prozedur die Werte der formalen Ausgabeparameter an die aktuellen Ausgabeparameter zugewiesen

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

parameter bergabe und laufzeitstapel referenzaufruf
Grundidee der Referenzübergabeist es, nicht den Wert selbst zum Kind zu kopieren, sondern nur eine Referenz auf das Objekt zu übergeben, die immer gleich groß ist (z. B. ein 32-Bit-Zeiger)

Das Kind arbeitet effektiv also mit einer Referenz-variablen vv als formalem Parameter, die eine Referenz-stufe höher ist als der Typ des aktuellen Parameters v

Sei out ein formaler und v ein aktueller Ausgabeparameter.

Parameterübergabe und Laufzeitstapel: Referenzaufruf

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

parameter bergabe und laufzeitstapel referenzaufruf168
Parameterübergabe und Laufzeitstapel: Referenzaufruf
  • Bemerkung: In C, wo es keine Referenzübergabe gibt, kann man den Effekt dieses Mechanismus dadurch erhalten, dass man in der Kind-Prozedur Zeiger-Variablen benutzt und die zusätzliche Indirektion beim Zugriff explizitausprogrammiert
    • In C++ existieren dagegen allgemeine Referenzvariablen. Der Compiler erledigt das automatisch, was man bei C selbst programmieren muss.

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

parameter bergabe und laufzeitstapel169
Parameterübergabe und Laufzeitstapel
  • Beipiel:Werteübergabe bei Referenzvariablen

Speicherbild der eingeschränkten Referenzübergabe in Java

am Punkt 1. Das Speicherbild sieht nach der Übergabe

eines Parameters vom Klassentyp int[] wie folgt aus:

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

parameter bergabe und laufzeitstapel170
Parameterübergabe und Laufzeitstapel
  • Beipiel bei Referenzübergabe

Speicherbild bei uneingeschränkter Referenzübergabe des

Parameters x am Punkt 1(in Java nicht möglich).

Wir hätten eine weitere Indirektion erhalten:

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

parameter bergabe und laufzeitstapel171
Parameterübergabe und Laufzeitstapel
  • Beipiel bei Referenzübergabe

Speicherbild bei uneingeschränkter Referenzübergabe des

Parameters x am Punkt 3(in Java nicht möglich).

Änderung des Wertes auch beim Vater

7

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

parameter bergabe und laufzeitstapel172
Parameterübergabe und Laufzeitstapel
  • Beipiel (Forts.):Werteübergabe bei Referenzvariablen

Speicherbild der eingeschränkten Referenzübergabe in Java

am Punkt 2. Die Zuweisung an ein Element ändert den Wert des Arrays auch beim Vater.

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

parameter bergabe und laufzeitstapel173
Parameterübergabe und Laufzeitstapel
  • Beipiel (Forts.):Werteübergabe bei Referenzvariablen

Speicherbild der eingeschränkten Referenzübergabe in Java

am Punkt 3. Das new ändert nur die Referenz im Sohn.

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

parameter bergabe und laufzeitstapel174
Parameterübergabe und Laufzeitstapel
  • Beipiel (Forts.):Werteübergabe bei Referenzvariablen

Speicherbild der eingeschränkten Referenzübergabe in Java

am Punkt 4 aufgrund der Zuweisung.

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

parameter bergabe und laufzeitstapel175
Parameterübergabe und Laufzeitstapel
  • Ein mögliches Speicherbild in C++
    • Reihungen oder andere komplexe Objekte können auch auf dem Stack angelegt werden
      • Sehr gefährlich (etwa dangling pointers)

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

spezifikation von unterprogrammen
Spezifikation von Unterprogrammen
  • Grobschema der Spezifikation
    • Vgl. hierzu auch die Anforderungen an Algorithmen

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

spezifikation von unterprogrammen177
Spezifikation von Unterprogrammen
  • Dokumentationskommentare
    • javadoc-Kommentare

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

rekursion in unterprogrammen
Rekursion in Unterprogrammen
  • Durch Unterprogramme können bequem rekursive Algorithmen realisiert werden
    • Beispiel: Berechnung des ggT

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

rekursion in unterprogrammen179
Rekursion in Unterprogrammen
  • Beweis der partiellen Korrektheit des Beispiels ggT
    • Die Reduktion ist korrekt: Wenn ressowohl b als auch a%b teilt, dann teilt es auch a wegen
      • a=(a/b)b+a%b (*)
    • Damit ist resein gemeinsamer Teiler von a und b
    • Dass ressogar der größtegemeinsame Teiler von a und b ist, sieht man wie folgt:
      • Sei r irgendein gemeinsamer Teiler von a und b
      • Dann ist r wegen (*) auch ein gemeinsamer Teiler von a%b
        • Da a%b=a-(a/b)b und r beide Summanden teilt
      • Somit gilt r teilt res

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

beispiel f r rekursive funktion ackermann funktion
Beispiel für rekursive Funktion: Ackermann-Funktion
  • Ackermann-FunktionIN × IN  IN ist wie folgt definiert

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

beispiel f r rekursive funktion ackermann funktion181
Beispiel für rekursive Funktion: Ackermann-Funktion
  • Wir verfolgen den Verlauf der Berechnung bei der Eingabe a = 1 und b = 3
    • Mit der fiktiven Rücksprungadresse 0 zeigen wir das Ende der Berechnung an

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