Java ist statisch typisiert, d.h., Variablen, Ergebnisse von Ausdrücken, etc. haben ein Datentyp, der schon bei der Kompilierung festgelegt wird.

Ähnliche Dokumente
4 Kontrollfluss-Diagramme

Beispiel Statische Typisierung. 5 Mehr Java. Primitive Datentypen Ganze Zahlen. 5.1 Basistypen

Beispiel: Start. Stop

Einführung in die Informatik 1

Algorithmen & Programmierung. Ausdrücke & Operatoren (1)

Java Einführung VARIABLEN und DATENTYPEN Kapitel 2

Kapitel 4. Programmierkurs. Datentypen. Arten von Datentypen. Wiederholung Kapitel 4. Birgit Engels, Anna Schulze WS 07/08

Programmiertechnik Operatoren, Kommentare, Ein-/Ausgabe

Einstieg in die Informatik mit Java

1. Referenzdatentypen: Felder und Strings. Referenz- vs. einfache Datentypen. Rückblick: Einfache Datentypen (1) 4711 r

Einführung Datentypen Verzweigung Schleifen. Java Crashkurs. Kim-Manuel Klein May 4, 2015

Einführung in den Einsatz von Objekt-Orientierung mit C++ I

1 Programmiersprachen

Primitive Datentypen

Einführung Datentypen Verzweigung Schleifen Funktionen Dynamische Datenstrukturen. Java Crashkurs. Kim-Manuel Klein

JAVA-Datentypen und deren Wertebereich

Vorkurs Informatik WiSe 16/17

Kapitel 05. Datentypen. Fachgebiet Knowledge Engineering Prof. Dr. Johannes Fürnkranz

Scala: Klassen, Methoden und Objekte. von Simon Lerch

Programmieren I. Kapitel 5. Kontrollfluss

Unterlagen. CPP-Uebungen-08/

Java Einführung Operatoren Kapitel 2 und 3

Java - Schleifen. Bedingung. wiederhole. Anweisung Anweisung Anweisung. Leibniz Universität IT Services Anja Aue

Kontrollstrukturen, Pseudocode und Modulo-Rechnung

C++ - Operatoren. Eigene Klassen mit neuen Funktionen

6 Speicherorganisation

1 Polymorphie (Vielgestaltigkeit)

Die einfachsten Anweisungen

3.4 Struktur von Programmen

RO-Tutorien 3 / 6 / 12

Javaprogrammierung mit NetBeans. Variablen, Datentypen, Methoden

Operatoren und Ausdrücke

Modellierung und Programmierung

Elementare Datentypen in C++

Primitive Datentypen und Felder (Arrays)

2.5 Primitive Datentypen

Gliederung. Tutorium zur Vorlesung. Gliederung. Gliederung. 1. Gliederung der Informatik. 1. Gliederung der Informatik. 1. Gliederung der Informatik

5.4 Klassen und Objekte

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 12/13. Kapitel 3. Grunddatentypen, Ausdrücke und Variable

Modul Entscheidungsunterstützung in der Logistik. Einführung in die Programmierung mit C++ Übung 2

Programmieren in C. Eine Einführung in die Programmiersprache C. Prof. Dr. Nikolaus Wulff

Wie entwerfe ich ein Programm?

Grundlagen der Informatik 2. Operatoren

Einstieg in die Informatik mit Java

II. Grundlagen der Programmierung. 9. Datenstrukturen. Daten zusammenfassen. In Java (Forts.): In Java:

Objektorientierte Programmierung OOP Programmieren mit Java

7 Funktionen. 7.1 Definition. Prototyp-Syntax: {Speicherklasse} {Typ} Name ({formale Parameter});

4. Datentypen. Einleitung Eingebaute Datentypen. Konversion / Type-Cast. Operatoren. Übersicht Die Datentypen char, float und double Standardwerte

Modellierung und Programmierung 1

Kapitel 3. Grunddatentypen, Ausdrücke und Variable

Modul 122 VBA Scribt.docx

Prinzipielle Ausführungsvarianten I

Tutoraufgabe 1 (Zweierkomplement): Lösung: Programmierung WS16/17 Lösung - Übung 2

Ein erstes Java-Programm

Kapitel 3: Variablen

Vorlesung Programmieren

Grundlagen der Programmierung Teil1 Einheit III Okt. 2010

Java - Zahlen, Wahrheitswerte und Zeichen. Leibniz Universität IT Services Anja Aue

Deklarationen in C. Prof. Dr. Margarita Esponda

Programmieren in C / C++ Grundlagen C 2

Java Kurs für Anfänger Einheit 2 Datentypen und Operationen

Elementare Konzepte von

Vorlesung 6: Operatoren, Logische Ausdrücke

C++ Notnagel. Ziel, Inhalt. Programmieren in C++

Propädeutikum zur Programmierung

Repetitorium Informatik (Java)

Der Aufruf von DM_in_Euro 1.40 sollte die Ausgabe 1.40 DM = Euro ergeben.

Einführung in die Informatik für Hörer aller Fakultäten II. Andreas Podelski Stephan Diehl Uwe Waldmann

Java - Zahlen, Wahrheitswerte und Zeichen. Leibniz Universität IT Services Anja Aue

Noch für heute: primitive Datentypen in JAVA. Primitive Datentypen. Pseudocode. Dezimal-, Binär- und Hexadezimalsystem. der logische Typ boolean

Einstieg in die Informatik mit Java

Vorkurs C++ Programmierung

Programmierung mit C Zeiger

Informatik I - Einstiegskurs

Einstieg in die Informatik mit Java

Programmieren in C++ Überladen von Methoden und Operatoren

C++ Teil 2. Sven Groß. 16. Apr IGPM, RWTH Aachen. Sven Groß (IGPM, RWTH Aachen) C++ Teil Apr / 22

Imperative Programmierung in Java. Algorithmen und Datenstrukturen II 1

Einstieg in die Informatik mit Java

1 Aufgaben 1.1 Umgebungsvariable setzen: CLASSPATH

Dr. Monika Meiler. Inhalt

Einstieg in die Informatik mit Java

Operatoren für elementare Datentypen Bedingte Anweisungen Schleifen. Programmieren I. Martin Schultheiß. Hochschule Darmstadt Wintersemester 2010/2011

2. Programmierung in C

1 Aufgaben 1.1 Objektorientiert: ("extended-hamster") Sammel-Hamster

Grundlagen der Objektorientierten Programmierung - Statische Arrays

Zeiger, Arrays und Strings in C und C++

Java 8. Elmar Fuchs Grundlagen Programmierung. 1. Ausgabe, Oktober 2014 JAV8

Probeklausur: Programmierung WS04/05

String-Konkatenation

Klausur Fachprüfung Wirtschaftsinformatik. Name:

Präzedenz von Operatoren

Verschlüsseln eines Bildes. Visuelle Kryptographie. Verschlüsseln eines Bildes. Verschlüsseln eines Bildes

Softwareentwicklung Ausdrücke und Typkonversionen

Programmiersprache 1 (C++) Prof. Dr. Stefan Enderle NTA Isny

Tag 4 Repetitorium Informatik (Java)

Propädeutikum zur Programmierung

Elementare Konzepte von

Das Typsystem von Scala. L. Piepmeyer: Funktionale Programmierung - Das Typsystem von Scala

Themen. Statische Methoden inline Methoden const Methoden this Zeiger Destruktor Kopierkonstruktor Überladen von Operatoren

Transkript:

5 Mehr Java Java ist statisch typisiert, d.h., Variablen, Ergebnisse von Ausdrücken, etc. haben ein Datentyp, der schon bei der Kompilierung festgelegt wird. Java unterscheidet zwei Arten von Typen: Basistypen / Primitive Datentypen byte, char, short, int, long, float, double, boolean Referenzdatentypen kann man auch selber definieren Harald Räcke 66/656

5 Mehr Java Java ist statisch typisiert, d.h., Variablen, Ergebnisse von Ausdrücken, etc. haben ein Datentyp, der schon bei der Kompilierung festgelegt wird. Java unterscheidet zwei Arten von Typen: Basistypen / Primitive Datentypen byte, char, short, int, long, float, double, boolean Referenzdatentypen kann man auch selber definieren 5 Mehr Java Harald Räcke 66/656

Beispiel Statische Typisierung a = 5 a = a + 1 a = "Hello World." # a is now a string a = a + 1 # runtime error Python int a; a = 5; a = "Hello World." // will not compile Java 5 Mehr Java Harald Räcke 67/656

5.1 Basistypen Primitive Datentypen Zu jedem Basistypen gibt es eine Menge möglicher Werte. Jeder Wert eines Basistyps benötigt den gleichen Platz, um ihn im Rechner zu repräsentieren. Der Platz wird in Bit gemessen. Wie viele Werte kann man mit n Bit darstellen? 5.1 Basistypen Harald Räcke 68/656

Primitive Datentypen Ganze Zahlen Es gibt vier Sorten ganzer Zahlen: Typ Platz kleinster Wert größter Wert byte 8 128 127 short 16 32 768 32 767 int 32 2 147 483 648 2 147 483 647 long 64 9 223 372 036 854 775 808 9 223 372 036 854 775 807 Die Benutzung kleinerer Typen wie byte oder short spart Platz. 5.1 Basistypen Harald Räcke 69/656

Primitive Datentypen Ganze Zahlen Literale: dezimale Notation hexadezimale Notation (Präfix 0x oder 0X) oktale Notation (Präfix 0) binäre Notation (Präfix 0b oder 0B) Suffix l oder L für long _ um Ziffern zu gruppieren Beispiele 192, 0b11000000, 0xC0, 0300 sind alle gleich 20_000L, 0xABFF_0078L 09, 0x_FF sind ungültig 5.1 Basistypen Harald Räcke 70/656

Primitive Datentypen Ganze Zahlen Literale: dezimale Notation hexadezimale Notation (Präfix 0x oder 0X) oktale Notation (Präfix 0) binäre Notation (Präfix 0b oder 0B) Suffix l oder L für long _ um Ziffern zu gruppieren Beispiele 192, 0b11000000, 0xC0, 0300 sind alle gleich 20_000L, 0xABFF_0078L 09, 0x_FF sind ungültig 5.1 Basistypen Harald Räcke 70/656

Primitive Datentypen Ganze Zahlen Achtung: Java warnt nicht vor Überlauf/Unterlauf!!! Beispiel: 1 int x = 2147483647; // groesstes int 2 x = x + 1; 3 write(x); liefert: -2147483648

Primitive Datentypen Gleitkommazahlen Es gibt zwei Sorten von Gleitkommazahlen: Typ Platz kleinster Wert größter Wert signifikante Stellen float 32 ca. 3.4 10 38 ca. 3.4 10 38 ca. 7 double 64 ca. 1.7 10 308 ca. 1.7 10 308 ca. 15 x = s m 2 e mit 1 m < 2 Vorzeichen s: 1 bit reduzierte Mantisse m 1: 23 bit (float), 52 bit (double) Exponent e: 8 bit (float), 11 bit (double) 5.1 Basistypen Harald Räcke 72/656

Primitive Datentypen Gleitkommazahlen Literale: dezimale Notation. dezimale Exponentialschreibweise (e, E für Exponent) hexadeximale Exponentialschreibweise. (Präfix 0x oder 0X, p oder P für Exponent) Suffix f oder F für float, Suffix d oder D für double (default is double) Beispiele 640.5F == 0x50.1p3f 3.1415 == 314.15E-2 0x1e3_dp0, 1e3d 0x1e3d, 1e3_d

Primitive Datentypen Gleitkommazahlen Überlauf/Unterlauf bei Berechnungen liefert Infinity, bzw. -Infinity Division Null durch Null, Wurzel aus einer negativen Zahl etc. liefert NaN

Weitere Basistypen Typ Platz Werte boolean 1 true,false char 16 all Unicode-Zeichen Unicode ist ein Zeichensatz, der alle irgendwo auf der Welt gängigen Alphabete umfasst, also zum Beispiel: die Zeichen unserer Tastatur (inklusive Umlaute); die chinesischen Schriftzeichen; die ägyptischen Hieroglyphen... Literale: char-literale schreibt man in Hochkommas: A, \u00ed, ;, \n. boolean-literale sind true und false.

5.2 Strings Der Datentyp String für Wörter ist ein Referenzdatentyp (genauer eine Klasse (dazu kommen wir später)). Hier nur drei Eigenschaften: Literale vom Typ String haben die Form "Hello World!"; Man kann Wörter in Variablen vom Typ String abspeichern; Man kann Wörter mithilfe des Operators + konkatenieren. 5.2 Strings Harald Räcke 76/656

Beispiel String s0 = " " ; String s1 = " Hel " ; String s2 = " lo Wo" ; String s3 = " rld! " ; write ( s0 + s1 + s2 + s3 ) ;... liefert: Hello World! 5.2 Strings Harald Räcke 77/656

5.3 Auswertung von Ausdrücken Funktionen in Java bekommen Parameter/Argumente als Input, und liefern als Output den Wert eines vorbestimmten Typs. Zum Beispiel könnte man eine Funktion i n t min ( i n t a, i n t b) implementieren, die das Minimum ihrer Argumente zurückliefert. Operatoren sind spezielle vordefinierte Funktionen, die in Infix-Notation geschrieben werden (wenn sie binär sind): a + b = +(a, b) 5.3 Auswertung von Ausdrücken Harald Räcke 78/656

5.3 Auswertung von Ausdrücken Ein Ausdruck ist eine Kombination von Literalen, Operatoren, Funktionen, Variablen und Klammern, die verwendet wird, um einen Wert zu berechnen. Beispiele: 7 + 4 (x z.b. vom Typ int) 3 / 5 + 3 min(3,x) + 20 x = 7 x *= 2 5.3 Auswertung von Ausdrücken Harald Räcke 79/656

Operatoren Unäre Operatoren: symbol name types L/R level ++ Post-increment () zahl, char links 2 -- Post-decrement () zahl, char links 2 ++ Pre-increment () zahl, char rechts 3 -- Pre-decrement () zahl, char rechts 3 + unäres Plus zahl, char rechts 3 - unäres Minus zahl, char rechts 3! Negation boolean rechts 3 5.3 Auswertung von Ausdrücken Harald Räcke 80/656

Achtung 5.3 Auswertung von Ausdrücken Harald Räcke 81/656

Prefix- und Postfixoperator Die Operatoranwendungen ++x und x++ inkrementieren beide den Wert der Variablen x (als Seiteneffekt). ++x tut das, bevor der Wert des Ausdrucks ermittelt wird (Pre-Increment). x++ tut das, nachdem der Wert ermittelt wurde (Post-Increment). b = x++; entspricht: b = ++x; entspricht: b = x ; x = x + 1; x = x + 1; b = x ; 5.3 Auswertung von Ausdrücken Harald Räcke 82/656

Operatoren Binäre arithmetische Operatoren: byte, short, char werden nach int konvertiert symbol name types L/R level * Multiplikation zahl, char links 4 / Division zahl, char links 4 % Modulo zahl, char links 4 + Addition zahl, char links 5 - Subtraktion zahl, char links 5 Konkatenation symbol name types L/R level + Konkatenation string links 5 5.3 Auswertung von Ausdrücken Harald Räcke 83/656

Operatoren Vergleichsoperatoren: symbol name types L/R level > größer zahl, char links? 7 >= größergleich zahl, char links? 7 < kleiner zahl, char links? 7 <= kleinergleich zahl, char links? 7 == gleich primitiv links 8!= ungleich primitiv links 8 5.3 Auswertung von Ausdrücken Harald Räcke 84/656

Operatoren Boolsche Operatoren: symbol name types L/R level && Und-Bedingung boolean links 12 Oder-Bedingung boolean links 13 5.3 Auswertung von Ausdrücken Harald Räcke 85/656

Operatoren Zuweisungsoperatoren: symbol name types L/R level = Zuweisung, wert rechts 15 *=,/=, %=, +=, -= Zuweisung, wert rechts 15 Für die letzte Form gilt: v = a v = (type(v)) (v a) 5.3 Auswertung von Ausdrücken Harald Räcke 86/656

Operatoren Warnung: Eine Zuweisung x = y; ist in Wahrheit ein Ausdruck. Der Wert ist der Wert der rechten Seite. Die Modifizierung der Variablen x erfolgt als Seiteneffekt. Das Semikolon ; hinter einem Ausdruck wirft nur den Wert weg. Fatal für Fehler in Bedingungen: boolean x = false ; i f ( x = true ) write ( " Sorry! This must be an error... " ) ; 5.3 Auswertung von Ausdrücken Harald Räcke 87/656

5.3 Auswertung von Ausdrücken Assoziativität Die Assoziativität entscheidet über die Reihenfolge bei Operatoren gleicher Priorität. (links = der linkeste Operator wird zuerst ausgeführt) Alle Operatoren einer Prioritätsgruppe haben dieselbe Assoziativität. Bis auf Zuweisungsoperatoren (=, +=, etc.) sind alle binären Operatoren linksassoziativ. unäre Operatoren, die ihr Argument rechts erwarten sind rechtsassoziativ unäre Operatoren, die ihr Argument links erwarten (postfix-operatoren ++, --) sind linksassoziativ Der ternäre Bedingungsoperator (später) ist rechtsassoziativ

5.3 Auswertung von Ausdrücken Assoziativität Die Assoziativität entscheidet über die Reihenfolge bei Operatoren gleicher Priorität. (links = der linkeste Operator wird zuerst ausgeführt) Alle Operatoren einer Prioritätsgruppe haben dieselbe Assoziativität. Bis auf Zuweisungsoperatoren (=, +=, etc.) sind alle binären Operatoren linksassoziativ. unäre Operatoren, die ihr Argument rechts erwarten sind rechtsassoziativ unäre Operatoren, die ihr Argument links erwarten (postfix-operatoren ++, --) sind linksassoziativ Der ternäre Bedingungsoperator (später) ist rechtsassoziativ

5.3 Auswertung von Ausdrücken Assoziativität Die Assoziativität entscheidet über die Reihenfolge bei Operatoren gleicher Priorität. (links = der linkeste Operator wird zuerst ausgeführt) Alle Operatoren einer Prioritätsgruppe haben dieselbe Assoziativität. Bis auf Zuweisungsoperatoren (=, +=, etc.) sind alle binären Operatoren linksassoziativ. unäre Operatoren, die ihr Argument rechts erwarten sind rechtsassoziativ unäre Operatoren, die ihr Argument links erwarten (postfix-operatoren ++, --) sind linksassoziativ Der ternäre Bedingungsoperator (später) ist rechtsassoziativ

5.3 Auswertung von Ausdrücken Assoziativität Die Assoziativität entscheidet über die Reihenfolge bei Operatoren gleicher Priorität. (links = der linkeste Operator wird zuerst ausgeführt) Alle Operatoren einer Prioritätsgruppe haben dieselbe Assoziativität. Bis auf Zuweisungsoperatoren (=, +=, etc.) sind alle binären Operatoren linksassoziativ. unäre Operatoren, die ihr Argument rechts erwarten sind rechtsassoziativ unäre Operatoren, die ihr Argument links erwarten (postfix-operatoren ++, --) sind linksassoziativ Der ternäre Bedingungsoperator (später) ist rechtsassoziativ

5.3 Auswertung von Ausdrücken Assoziativität Die Assoziativität entscheidet über die Reihenfolge bei Operatoren gleicher Priorität. (links = der linkeste Operator wird zuerst ausgeführt) Alle Operatoren einer Prioritätsgruppe haben dieselbe Assoziativität. Bis auf Zuweisungsoperatoren (=, +=, etc.) sind alle binären Operatoren linksassoziativ. unäre Operatoren, die ihr Argument rechts erwarten sind rechtsassoziativ unäre Operatoren, die ihr Argument links erwarten (postfix-operatoren ++, --) sind linksassoziativ Der ternäre Bedingungsoperator (später) ist rechtsassoziativ

5.3 Auswertung von Ausdrücken Assoziativität Die Assoziativität entscheidet über die Reihenfolge bei Operatoren gleicher Priorität. (links = der linkeste Operator wird zuerst ausgeführt) Alle Operatoren einer Prioritätsgruppe haben dieselbe Assoziativität. Bis auf Zuweisungsoperatoren (=, +=, etc.) sind alle binären Operatoren linksassoziativ. unäre Operatoren, die ihr Argument rechts erwarten sind rechtsassoziativ unäre Operatoren, die ihr Argument links erwarten (postfix-operatoren ++, --) sind linksassoziativ Der ternäre Bedingungsoperator (später) ist rechtsassoziativ

5.3 Auswertung von Ausdrücken Die Auswertung eines Ausdrucks liefert eine Variable (), einen reinen Wert () oder void (void) In den ersten beiden Fällen hat der Ausdruck dann einen Typ, z.b.: int, und einen Wert, z.b.: 42 Für z.b. Zuweisungen muss die Auswertung des Ausdrucks auf der linken Seite eine Variable ergeben!!! 5.3 Auswertung von Ausdrücken Harald Räcke 89/656

5.3 Auswertung von Ausdrücken In Java werden Unterausdrücke von links nach rechts ausgewertet. D.h. um den Wert einer Operation zu berechnen: werte (rekursiv) alle Operanden von links nach rechts aus führe die Operation auf den Resultaten aus Ausnahmen:, &&, und der ternäre Bedingungsoperator :?, werten nicht all Operanden aus (Kurzschlussauswertung). Man sollte nie Ausdrücke formulieren, deren Ergebnis von der Auswertungsreihenfolge abhängt!!! 5.3 Auswertung von Ausdrücken Harald Räcke 90/656

5.3 Auswertung von Ausdrücken In Java werden Unterausdrücke von links nach rechts ausgewertet. D.h. um den Wert einer Operation zu berechnen: werte (rekursiv) alle Operanden von links nach rechts aus führe die Operation auf den Resultaten aus Ausnahmen:, &&, und der ternäre Bedingungsoperator :?, werten nicht all Operanden aus (Kurzschlussauswertung). Man sollte nie Ausdrücke formulieren, deren Ergebnis von der Auswertungsreihenfolge abhängt!!! 5.3 Auswertung von Ausdrücken Harald Räcke 90/656

5.3 Auswertung von Ausdrücken Im folgenden betrachten wir Klammern als einen Operator der nichts tut: symbol name types L/R level ( ) Klammerung * links 0 5.3 Auswertung von Ausdrücken Harald Räcke 91/656

Beispiel: 2 + x * (z - d) 2 + x * ( z d )

Beispiel: 2 + x * (z - d) 2 + x * ( z d )

Beispiel: 2 + x * (z - d) 2 + x * ( z d )

Beispiel: 2 + x * (z - d) 2 + x * ( ) z d

Beispiel: 2 + x * (z - d) 2 + x * ( ) z d

Beispiel: 2 + x * (z - d) 2 + * x ( ) z d

Beispiel: 2 + x * (z - d) 2 + * x ( ) z d

Beispiel: 2 + x * (z - d) + 2 * x ( ) z d

Beispiel: 2 + x * (z - d) + 2 * x ( ) z d

Beispiel: 2 + x * (z - d) + 2 * x ( ) z d

Beispiel: 2 + x * (z - d) + 2 * x ( ) z d x -3 d 7 z 5

Beispiel: 2 + x * (z - d) + 2 * x ( ) z d x -3 d 7 z 5

Beispiel: 2 + x * (z - d) 2, int + 2 * x ( ) z d x -3 d 7 z 5

Beispiel: 2 + x * (z - d) 2, int + 2 * x ( ) z d x -3 d 7 z 5

Beispiel: 2 + x * (z - d) 2, int + 2 * -3, int x ( ) z d x -3 d 7 z 5

Beispiel: 2 + x * (z - d) 2, int + 2 * -3, int x ( ) z d x -3 d 7 z 5

Beispiel: 2 + x * (z - d) 2, int + 2 * -3, int x ( ) 5, int z d x -3 d 7 z 5

Beispiel: 2 + x * (z - d) 2, int + 2 * -3, int x ( ) 5, int z d x -3 d 7 z 5

Beispiel: 2 + x * (z - d) 2, int + 2 * -3, int x ( ) 5, int z 7, int d x -3 d 7 z 5

Beispiel: 2 + x * (z - d) 2, int + 2 * -3, int x ( ) 5, int z 7, int d x -3 d 7 z 5

Beispiel: 2 + x * (z - d) 2, int + 2 * -3, int x ( ) 5, int z -2, int 7, int d x -3 d 7 z 5

Beispiel: 2 + x * (z - d) 2, int + 2 * -3, int x ( ) 5, int z -2, int 7, int d x -3 d 7 z 5

Beispiel: 2 + x * (z - d) 2, int + 2 * -3, int -2, int x ( ) 5, int z -2, int 7, int d x -3 d 7 z 5

Beispiel: 2 + x * (z - d) 2, int + 2 * -3, int -2, int x ( ) 5, int z -2, int 7, int d x -3 d 7 z 5

Beispiel: 2 + x * (z - d) 2, int + 2 * -3, int 6, int -2, int x ( ) 5, int z -2, int 7, int d x -3 d 7 z 5

Beispiel: 2 + x * (z - d) 2, int + 2 * -3, int 6, int -2, int x ( ) 5, int z -2, int 7, int d x -3 d 7 z 5

Beispiel: 2 + x * (z - d) 2, int 8, int + 2 * -3, int 6, int -2, int x ( ) 5, int z -2, int 7, int d x -3 d 7 z 5

Beispiel: a = b = c = d = 0 a = b = c = d = 0

Beispiel: a = b = c = d = 0 a = b = c = d = 0

Beispiel: a = b = c = d = 0 a = b = c = d = 0

Beispiel: a = b = c = d = 0 a = b = c = = d 0

Beispiel: a = b = c = d = 0 a = b = c = = d 0

Beispiel: a = b = c = d = 0 a = b = = c = d 0

Beispiel: a = b = c = d = 0 a = b = = c = d 0

Beispiel: a = b = c = d = 0 a = = b = c = d 0

Beispiel: a = b = c = d = 0 a = = b = c = d 0

Beispiel: a = b = c = d = 0 = a = b = c = d 0

Beispiel: a = b = c = d = 0 = a = b = c = d 0 a -3 b 7 c 5 d 2

Beispiel: a = b = c = d = 0 = a = b = c = d 0 a -3 b 7 c 5 d 2

Beispiel: a = b = c = d = 0-3, int = a = b = c = d 0 a -3 b 7 c 5 d 2

Beispiel: a = b = c = d = 0-3, int = a = b = c = d 0 a -3 b 7 c 5 d 2

Beispiel: a = b = c = d = 0-3, int = a = 7, int b = c = d 0 a -3 b 7 c 5 d 2

Beispiel: a = b = c = d = 0-3, int = a = 7, int b = c = d 0 a -3 b 7 c 5 d 2

Beispiel: a = b = c = d = 0-3, int = a = 7, int b = 5, int c = d 0 a -3 b 7 c 5 d 2

Beispiel: a = b = c = d = 0-3, int = a = 7, int b = 5, int c = d 0 a -3 b 7 c 5 d 2

Beispiel: a = b = c = d = 0-3, int = a = 7, int b = 5, int c = 2, int d 0 a -3 b 7 c 5 d 2

Beispiel: a = b = c = d = 0-3, int = a = 7, int b = 5, int c = 2, int d 0 a -3 b 7 c 5 d 2

Beispiel: a = b = c = d = 0-3, int = a = 7, int b = 5, int c = 2, int 0, int d 0 a -3 b 7 c 5 d 2

Beispiel: a = b = c = d = 0-3, int = a = 7, int b = 5, int c = 2, int 0, int d 0 a -3 b 7 c 5 d 2

Beispiel: a = b = c = d = 0-3, int = a = 7, int b = 5, int c = 2, int 0, int 0, int d 0 a -3 b 7 c 5 d 0

Beispiel: a = b = c = d = 0-3, int = a = 7, int b = 5, int c = 2, int 0, int 0, int d 0 a -3 b 7 c 5 d 0

Beispiel: a = b = c = d = 0-3, int = a = 7, int b = 5, int 0, int c = 2, int 0, int 0, int d 0 a -3 b 7 c 0 d 0

Beispiel: a = b = c = d = 0-3, int = a = 7, int b = 5, int 0, int c = 2, int 0, int 0, int d 0 a -3 b 7 c 0 d 0

Beispiel: a = b = c = d = 0-3, int = a = 7, int 0, int b = 5, int 0, int c = 2, int 0, int 0, int d 0 a -3 b 0 c 0 d 0

Beispiel: a = b = c = d = 0-3, int = a = 7, int 0, int b = 5, int 0, int c = 2, int 0, int 0, int d 0 a -3 b 0 c 0 d 0

Beispiel: a = b = c = d = 0-3, int 0, int = a = 7, int 0, int b = 5, int 0, int c = 2, int 0, int 0, int d 0 a 0 b 0 c 0 d 0

Beispiel: a!= 0 && b/a < 10 a!= 0 && b / a < 10

Beispiel: a!= 0 && b/a < 10 a!= 0 && b / a < 10

Beispiel: a!= 0 && b/a < 10 a!= 0 && b / a < 10

Beispiel: a!= 0 && b/a < 10 a!= 0 && / < 10 b a

Beispiel: a!= 0 && b/a < 10 a!= 0 && / < 10 b a

Beispiel: a!= 0 && b/a < 10 a!= 0 && < / 10 b a

Beispiel: a!= 0 && b/a < 10 a!= 0 && < / 10 b a

Beispiel: a!= 0 && b/a < 10!= && < a 0 / 10 b a

Beispiel: a!= 0 && b/a < 10!= && < a 0 / 10 b a

Beispiel: a!= 0 && b/a < 10 &&!= < a 0 / 10 b a

Beispiel: a!= 0 && b/a < 10 &&!= < a 0 / 10 b a a 0 b 4

Beispiel: a!= 0 && b/a < 10 &&!= < a 0 / 10 b a a 0 b 4

Beispiel: a!= 0 && b/a < 10 &&!= < a 0 0, int b / a 10 a 0 b 4

Beispiel: a!= 0 && b/a < 10 &&!= < a 0 0, int b / a 10 a 0 b 4

Beispiel: a!= 0 && b/a < 10 &&!= < a 0 0, int 0, int b / a 10 a 0 b 4

Beispiel: a!= 0 && b/a < 10 &&!= < a 0 0, int 0, int b / a 10 a 0 b 4

Beispiel: a!= 0 && b/a < 10 false, boolean!= && < a 0 0, int 0, int b / a 10 a 0 b 4

Beispiel: a!= 0 && b/a < 10 false, boolean!= && < a 0 0, int 0, int b / a 10 a 0 b 4

Beispiel: a!= 0 && b/a < 10 false, boolean!= false, boolean && < a 0 0, int 0, int b / a 10 a 0 b 4

Beispiel: y = x + ++x y = x + ++ x

Beispiel: y = x + ++x y = x + ++ x

Beispiel: y = x + ++x y = x + ++ x

Beispiel: y = x + ++x y = x + ++ x

Beispiel: y = x + ++x y = x + ++ x

Beispiel: y = x + ++x y = + x ++ x

Beispiel: y = x + ++x y = + x ++ x

Beispiel: y = x + ++x = y + x ++ x

Beispiel: y = x + ++x = y + x ++ x x 4 y 0

Beispiel: y = x + ++x = y + x ++ x x 4 y 0

Beispiel: y = x + ++x = y + 0, int x ++ x x 4 y 0

Beispiel: y = x + ++x = y + 0, int x ++ x x 4 y 0

Beispiel: y = x + ++x = y + 0, int x ++ 4, int x x 4 y 0

Beispiel: y = x + ++x = y + 0, int x ++ 4, int x x 4 y 0

Beispiel: y = x + ++x = y + 0, int x ++ 4, int x 4, int x 4 y 0

Beispiel: y = x + ++x = y + 0, int x ++ 4, int x 4, int x 4 y 0

Beispiel: y = x + ++x = y + 0, int x ++ 4, int 5, int x 4, int x 5 y 0

Beispiel: y = x + ++x = y + 0, int x ++ 4, int 5, int x 4, int x 5 y 0

Beispiel: y = x + ++x = y + 0, int x ++ 4, int 9, int 5, int x 4, int x 5 y 0

Beispiel: y = x + ++x = y + 0, int x ++ 4, int 9, int 5, int x 4, int x 5 y 0

Beispiel: y = x + ++x = y + 0, int 9, int x ++ 4, int 9, int 5, int x 4, int x 5 y 9

Beispiel: y = x++ + x y = x ++ + x

Beispiel: y = x++ + x y = x ++ + x

Beispiel: y = x++ + x y = x ++ + x

Beispiel: y = x++ + x y = ++ + x x

Beispiel: y = x++ + x y = ++ + x x

Beispiel: y = x++ + x y = + ++ x x

Beispiel: y = x++ + x y = + ++ x x

Beispiel: y = x++ + x = y + ++ x x

Beispiel: y = x++ + x = y + ++ x x x 4 y 0

Beispiel: y = x++ + x = y + ++ x x x 4 y 0

Beispiel: y = x++ + x = y + 0, int ++ x x x 4 y 0

Beispiel: y = x++ + x = y + 0, int ++ x x x 4 y 0

Beispiel: y = x++ + x = y + 0, int ++ x x 4, int x 4 y 0

Beispiel: y = x++ + x = y + 0, int ++ x x 4, int x 4 y 0

Beispiel: y = x++ + x = y + 0, int 4, int ++ x x 4, int x 5 y 0

Beispiel: y = x++ + x = y + 0, int 4, int ++ x x 4, int x 5 y 0

Beispiel: y = x++ + x = y + 0, int x 4, int 4, int ++ x 5, int x 5 y 0

Beispiel: y = x++ + x = y + 0, int x 4, int 4, int ++ x 5, int x 5 y 0

Beispiel: y = x++ + x = y + 0, int x 4, int 4, int ++ 9, int x 5, int x 5 y 0

Beispiel: y = x++ + x = y + 0, int x 4, int 4, int ++ 9, int x 5, int x 5 y 0

Beispiel: y = x++ + x = y + 0, int 9, int x 4, int 4, int ++ 9, int x 5, int x 5 y 9

Beispiel: y = x++ + x = y + 0, int 9, int x 4, int 4, int ++ 9, int x 5, int x 5 y 9

Impliziter Typecast Wenn ein Ausdruck vom TypA an einer Stelle verwendet wird, wo ein Ausdruck vom TypB erforderlich ist, wird entweder der Ausdruck vom TypA in einen Ausdruck vom TypB gecasted (impliziter Typecast), oder ein Compilerfehler erzeugt, falls dieser Cast nicht (automatisch) erlaubt ist. Beispiel: Zuweisung long x = 5; i n t y = 3; x = y ; // impliziter Cast von i n t nach long

Erlaubte Implizite Typecasts Numerische Typen double float Gleitkommazahlen long short int char ganze Zahlen byte Konvertierung von long nach double oder von int nach float kann Information verlieren wird aber automatisch durchgeführt.

Welcher Typ wird benötigt? Operatoren sind üblicherweise überladen, d.h. ein Symbol (+, -,... ) steht in Abhängigkeit der Parameter (Argumente) für unterschiedliche Funktionen. + : int int + : long long + : float float + : double double + : int int int + : long long long + : float float float + : double double double + : String String String Der Compiler muss in der Lage sein während der Compilierung die richtige Funktion zu bestimmen.

Impliziter Typecast Der Compiler wertet nur die Typen des Ausdrucksbaums aus. Für jeden inneren Knoten wählt er dann die geeignete Funktion (z.b. + : long long long) falls ein +-Knoten zwei long-argumente erhält. Falls keine passende Funktion gefunden wird, versucht der Compiler durch implizite Typecasts die Operanden an eine Funktion anzupassen. Dies geschieht auch für selbstgeschriebene Funktionen (z.b. min(int a, int b) und min(long a, long b)). Der Compiler nimmt die Funktion mit der speziellsten Signatur.

Speziellste Signatur 5.3 Auswertung von Ausdrücken Harald Räcke 101/656

Ordnungsrelationen Relation : TypA TypB falls TypA nach TypB (implizit) gecasted werden kann: reflexiv: T T transitiv: T 1 T 2 T 2 T 3 T 1 T 3 antisymmetrisch: T 1 T 2 T 2 T 1 T 1 = T 2 d.h., definiert Halbordnung auf der Menge der Typen. Relation k : (T 1,..., T k ) k (T 1,..., T k ) falls T i T i i {1,..., k}. reflexiv: T k T für alle transitiv: T 1 k T 2 T 2 k T 3 T 1 k T 3 antisymmetrisch: T 1 k T 2 T 2 k T 1 T 1 = T 2 d.h., k definiert Halbordnung auf der Menge der k-tupel von Typen.

Ordnungsrelationen Relation : TypA TypB falls TypA nach TypB (implizit) gecasted werden kann: reflexiv: T T transitiv: T 1 T 2 T 2 T 3 T 1 T 3 antisymmetrisch: T 1 T 2 T 2 T 1 T 1 = T 2 d.h., definiert Halbordnung auf der Menge der Typen. Relation k : (T 1,..., T k ) k (T 1,..., T k ) falls T i T i i {1,..., k}. reflexiv: T k T für alle transitiv: T 1 k T 2 T 2 k T 3 T 1 k T 3 antisymmetrisch: T 1 k T 2 T 2 k T 1 T 1 = T 2 d.h., k definiert Halbordnung auf der Menge der k-tupel von Typen.

R 1 f (T 1 ) R 2 f (T 2 ). R l f (T l ) f T 1 T 2... T k 1 T k T 1,..., T l sind k-tupel von Typen für die eine Definition von f existiert. T = (T 1,..., T k ) ist das k-tupel von Typen mit dem f aufgerufen wird. Menge aller möglichen Funktionen/Tupel: M := {T i T k T i }. Wähle kleinstes Element aus M falls M ein eindeutig kleinstes Element besitzt (sonst Compilerfehler).

R 1 f (T 1 ) R 2 f (T 2 ). R l f (T l ) f T 1 T 2... T k 1 T k T 1,..., T l sind k-tupel von Typen für die eine Definition von f existiert. T = (T 1,..., T k ) ist das k-tupel von Typen mit dem f aufgerufen wird. Menge aller möglichen Funktionen/Tupel: M := {T i T k T i }. Wähle kleinstes Element aus M falls M ein eindeutig kleinstes Element besitzt (sonst Compilerfehler).

R 1 f (T 1 ) R 2 f (T 2 ). R l f (T l ) f T 1 T 2... T k 1 T k T 1,..., T l sind k-tupel von Typen für die eine Definition von f existiert. T = (T 1,..., T k ) ist das k-tupel von Typen mit dem f aufgerufen wird. Menge aller möglichen Funktionen/Tupel: M := {T i T k T i }. Wähle kleinstes Element aus M falls M ein eindeutig kleinstes Element besitzt (sonst Compilerfehler).

Impliziter Typecast Numerische Typen Angenommen wir haben Funktionen int min(int a, int b) float min(float a, float b) double min(double a, double b) definiert. 1 long a = 7, b = 3; 2 double d = min(a, b); würde die Funktion float min(float a, float b) aufrufen. 5.3 Auswertung von Ausdrücken Harald Räcke 104/656

Impliziter Typecast Bei Ausdrücken mit Seiteneffekten (Zuweisungen, ++, - -) gelten andere Regeln: Beispiel: Zuweisungen = : byte byte byte = : char char char = : short short short = : int int int = : long long long = : float float float = : double double double Es wird nur der Parameter konvertiert, der nicht dem Seiteneffekt unterliegt. 5.3 Auswertung von Ausdrücken Harald Räcke 105/656

5.3 Auswertung von Ausdrücken Der Funktionsaufrufoperator: symbol name types L/R level ( ) Funktionsaufruf Funktionsname, * links 1 5.3 Auswertung von Ausdrücken Harald Räcke 106/656

Beispiel: x = min(a, min(a,b) + 4L) x = min ( a, min ( a, b ) + 4L )

Beispiel: x = min(a, min(a,b) + 4L) x = min ( a, min ( a, b ) + 4L )

Beispiel: x = min(a, min(a,b) + 4L) x = min ( a, min ( a, b ) + 4L )

Beispiel: x = min(a, min(a,b) + 4L) x = ( ) min a min ( a, b ) + 4L

Beispiel: x = min(a, min(a,b) + 4L) x = ( ) min a min ( a, b ) + 4L

Beispiel: x = min(a, min(a,b) + 4L) x = ( ) min a ( ) + 4L min a b

Beispiel: x = min(a, min(a,b) + 4L) x = ( ) min a ( ) + 4L min a b

Beispiel: x = min(a, min(a,b) + 4L) x = ( ) min a + ( ) 4L min a b

Beispiel: x = min(a, min(a,b) + 4L) x = ( ) min a + ( ) 4L min a b

Beispiel: x = min(a, min(a,b) + 4L) = x ( ) min a + ( ) 4L min a b int min(int,int) float min(float,float) double min(double,double) long x 7 int a 3 int b 5

Beispiel: x = min(a, min(a,b) + 4L) = x ( ) min a + ( ) 4L min a b int min(int,int) float min(float,float) double min(double,double) long x 7 int a 3 int b 5

Beispiel: x = min(a, min(a,b) + 4L) = x ( ) 7, long min a + ( ) 4L min a b int min(int,int) float min(float,float) double min(double,double) long x 7 int a 3 int b 5

Beispiel: x = min(a, min(a,b) + 4L) = x ( ) 7, long min a + ( ) 4L min a b int min(int,int) float min(float,float) double min(double,double) long x 7 int a 3 int b 5

Beispiel: x = min(a, min(a,b) + 4L) = x ( ) 7, long min a +, function list ( ) 4L min a b int min(int,int) float min(float,float) double min(double,double) long x 7 int a 3 int b 5

Beispiel: x = min(a, min(a,b) + 4L) = x ( ) 7, long min a +, function list ( ) 4L min a b int min(int,int) float min(float,float) double min(double,double) long x 7 int a 3 int b 5

Beispiel: x = min(a, min(a,b) + 4L) = x ( ) 7, long min a +, function list 3, int ( ) 4L min a b int min(int,int) float min(float,float) double min(double,double) long x 7 int a 3 int b 5

Beispiel: x = min(a, min(a,b) + 4L) = x ( ) 7, long min a +, function list 3, int ( ) 4L min a b int min(int,int) float min(float,float) double min(double,double) long x 7 int a 3 int b 5

Beispiel: x = min(a, min(a,b) + 4L) = x ( ) 7, long min a +, function list 3, int ( ) 4L min a b, function list int min(int,int) float min(float,float) double min(double,double) long x 7 int a 3 int b 5

Beispiel: x = min(a, min(a,b) + 4L) = x ( ) 7, long min a +, function list 3, int ( ) 4L min a b, function list int min(int,int) float min(float,float) double min(double,double) long x 7 int a 3 int b 5

Beispiel: x = min(a, min(a,b) + 4L) = x ( ) 7, long min a +, function list 3, int ( ) 4L min a b, function list 3, int int min(int,int) float min(float,float) double min(double,double) long x 7 int a 3 int b 5

Beispiel: x = min(a, min(a,b) + 4L) = x ( ) 7, long min a +, function list 3, int ( ) 4L min a b, function list 3, int int min(int,int) float min(float,float) double min(double,double) long x 7 int a 3 int b 5

Beispiel: x = min(a, min(a,b) + 4L) = x ( ) 7, long min a +, function list 3, int ( ) 4L min a b, function list 3, int 5, int int min(int,int) float min(float,float) double min(double,double) long x 7 int a 3 int b 5

Beispiel: x = min(a, min(a,b) + 4L) = x ( ) 7, long min a +, function list 3, int ( ) 4L min a b, function list 3, int 5, int int min(int,int) float min(float,float) double min(double,double) long x 7 int a 3 int b 5

Beispiel: x = min(a, min(a,b) + 4L) = x ( ) 7, long min a +, function list 3, int 3, int ( ) 4L min a b, function list 3, int 5, int int min(int,int) float min(float,float) double min(double,double) long x 7 int a 3 int b 5

Beispiel: x = min(a, min(a,b) + 4L) = x ( ) 7, long min a +, function list 3, int 3, int ( ) 4L min a b, function list 3, int 5, int int min(int,int) float min(float,float) double min(double,double) long x 7 int a 3 int b 5

Beispiel: x = min(a, min(a,b) + 4L) = x ( ) 7, long min a +, function list 3, int ( ) min a b, function list 3, int 3, int 5, int 4L 4, long int min(int,int) float min(float,float) double min(double,double) long x 7 int a 3 int b 5

Beispiel: x = min(a, min(a,b) + 4L) = x ( ) 7, long min a +, function list 3, int ( ) min a b, function list 3, int 3, int 5, int 4L 4, long int min(int,int) float min(float,float) double min(double,double) long x 7 int a 3 int b 5

Beispiel: x = min(a, min(a,b) + 4L) = x ( ) 7, long min a +, function list 3, int ( ) min a b, function list 3, int 3, int long 5, int 7, long 4L 4, long int min(int,int) float min(float,float) double min(double,double) long x 7 int a 3 int b 5

Beispiel: x = min(a, min(a,b) + 4L) = x ( ) 7, long min a +, function list 3, int ( ) min a b, function list 3, int 3, int long 5, int 7, long 4L 4, long int min(int,int) float min(float,float) double min(double,double) long x 7 int a 3 int b 5

Beispiel: x = min(a, min(a,b) + 4L) = x ( ) 7, long min a +, function list 3, int float 3.0, float ( ) min a b, function list 3, int 3, int float long 5, int 7, long 4L 4, long int min(int,int) float min(float,float) double min(double,double) long x 7 int a 3 int b 5

Beispiel: x = min(a, min(a,b) + 4L) = x ( ) 7, long min a +, function list 3, int float 3.0, float ( ) min a b, function list 3, int 3, int float long 5, int 7, long 4L 4, long int min(int,int) float min(float,float) double min(double,double) long x 7 int a 3 int b 5

Beispiel: x = min(a, min(a,b) + 4L) float is not casted to long ERROR = x ( ) 7, long min a +, function list 3, int float 3.0, float ( ) min a b, function list 3, int 3, int float long 5, int 7, long 4L 4, long int min(int,int) float min(float,float) double min(double,double) long x 7 int a 3 int b 5

Impliziter Typecast Strings Spezialfall Falls beim Operator + ein Typ vom Typ String ist, wird der andere auch in einen String umgewandelt. Stringkonkatenation. Jeder Typ in Java besitzt eine Stringrepresentation. Funktioniert nicht bei selbstgeschriebenen Funktionen. 5.3 Auswertung von Ausdrücken Harald Räcke 108/656

Beispiel: s = a + b s = a + b

Beispiel: s = a + b s = a + b

Beispiel: s = a + b s = a + b

Beispiel: s = a + b s = + a b

Beispiel: s = a + b s = + a b

Beispiel: s = a + b = s + a b

Beispiel: s = a + b = s + a b String s "Hallo" a 2 b 6

Beispiel: s = a + b = s + a b String s "Hallo" a 2 b 6

Beispiel: s = a + b = s + "Hallo", String a b String s "Hallo" a 2 b 6

Beispiel: s = a + b = s + "Hallo", String a b String s "Hallo" a 2 b 6

Beispiel: s = a + b = s + "Hallo", String a 2, int b String s "Hallo" a 2 b 6

Beispiel: s = a + b = s + "Hallo", String a 2, int b String s "Hallo" a 2 b 6

Beispiel: s = a + b = s + "Hallo", String a 2, int b 6, int String s "Hallo" a 2 b 6

Beispiel: s = a + b = s + "Hallo", String a 2, int b 6, int String s "Hallo" a 2 b 6

Beispiel: s = a + b = s + "Hallo", String a 2, int 8, int b 6, int String s "Hallo" a 2 b 6

Beispiel: s = a + b = s + "Hallo", String a 2, int 8, int b 6, int String s "Hallo" a 2 b 6

Beispiel: s = a + b int is not casted to String ERROR = s + "Hallo", String a 2, int 8, int b 6, int String s "Hallo" a 2 b 6

Beispiel: s = "" + a + b s = "" + a + b

Beispiel: s = "" + a + b s = "" + a + b

Beispiel: s = "" + a + b s = "" + a + b

Beispiel: s = "" + a + b s = + + b "" a

Beispiel: s = "" + a + b s = + + b "" a

Beispiel: s = "" + a + b s = + + b "" a

Beispiel: s = "" + a + b s = + + b "" a

Beispiel: s = "" + a + b = s + + b "" a String s "Hallo" a 2 b 6

Beispiel: s = "" + a + b = s + + b "" a String s "Hallo" a 2 b 6

Beispiel: s = "" + a + b = s + "Hallo", String + b "" a String s "Hallo" a 2 b 6

Beispiel: s = "" + a + b = s + "Hallo", String + b "" a String s "Hallo" a 2 b 6

Beispiel: s = "" + a + b = s + "Hallo", String + b "" a "", String String s "Hallo" a 2 b 6

Beispiel: s = "" + a + b = s + "Hallo", String + b "" a "", String String s "Hallo" a 2 b 6

Beispiel: s = "" + a + b = s + "Hallo", String + b "" a "", String 2, int String s "Hallo" a 2 b 6

Beispiel: s = "" + a + b = s + "Hallo", String + b "" a "", String 2, int String s "Hallo" a 2 b 6

Beispiel: s = "" + a + b = s + "Hallo", String "2", String + String b "" a "", String 2, int String s "Hallo" a 2 b 6

Beispiel: s = "" + a + b = s + "Hallo", String "2", String + String b "" a "", String 2, int String s "Hallo" a 2 b 6

Beispiel: s = "" + a + b = s + "Hallo", String + "" a "", String "2", String String 2, int b 6, int String s "Hallo" a 2 b 6

Beispiel: s = "" + a + b = s + "Hallo", String + "" a "", String "2", String String 2, int b 6, int String s "Hallo" a 2 b 6

Beispiel: s = "" + a + b = s + "Hallo", String + "" a "", String "2", String String "26", String 2, int String b 6, int String s "Hallo" a 2 b 6

Beispiel: s = "" + a + b = s + "Hallo", String + "" a "", String "2", String String "26", String 2, int String b 6, int String s "Hallo" a 2 b 6

Beispiel: s = "" + a + b = s + "Hallo", String "26" "26", String + "" a "", String "2", String String "26", String 2, int String b 6, int String s "Hallo" a 2 b 6

Beispiel: s = s + 1 s = s + 1

Beispiel: s = s + 1 s = s + 1

Beispiel: s = s + 1 s = s + 1

Beispiel: s = s + 1 s = + s 1

Beispiel: s = s + 1 s = + s 1

Beispiel: s = s + 1 = s + s 1

Beispiel: s = s + 1 = s + s 1 short s 4

Beispiel: s = s + 1 = s + s 1 short s 4

Beispiel: s = s + 1 = s + 4, short s 1 short s 4

Beispiel: s = s + 1 = s + 4, short s 1 short s 4

Beispiel: s = s + 1 = s + 4, short s 1 4, short short s 4

Beispiel: s = s + 1 = s + 4, short s 1 4, short short s 4

Beispiel: s = s + 1 = s + 4, short s 1 4, short 1, int short s 4

Beispiel: s = s + 1 = s + 4, short s 1 4, short 1, int short s 4

Beispiel: s = s + 1 = s + 4, short int s 1 4, short 5, int 1, int short s 4

Beispiel: s = s + 1 = s + 4, short int s 1 4, short 5, int 1, int short s 4

Beispiel: s = s + 1 int is not casted to short ERROR = s + 4, short int s 1 4, short 5, int 1, int short s 4

Beispiel: s = s + 1 int is not casted to short ERROR = s + 4, short int s 1 4, short 5, int 1, int short s 4

Beispiel: s = 7 + 1 s = 7 + 1

Beispiel: s = 7 + 1 s = 7 + 1

Beispiel: s = 7 + 1 s = 7 + 1

Beispiel: s = 7 + 1 s = + 7 1

Beispiel: s = 7 + 1 s = + 7 1

Beispiel: s = 7 + 1 = s + 7 1

Beispiel: s = 7 + 1 = s + 7 1 short s 4

Beispiel: s = 7 + 1 = s + 7 1 short s 4

Beispiel: s = 7 + 1 = s + 4, short 7 1 short s 4

Beispiel: s = 7 + 1 = s + 4, short 7 1 short s 4

Beispiel: s = 7 + 1 = s + 4, short 7 1 7, int short s 4

Beispiel: s = 7 + 1 = s + 4, short 7 1 7, int short s 4

Beispiel: s = 7 + 1 = s + 4, short 7 1 7, int 1, int short s 4

Beispiel: s = 7 + 1 = s + 4, short 7 1 7, int 1, int short s 4

Beispiel: s = 7 + 1 = s + 4, short 7 1 7, int 8, int 1, int short s 4

Beispiel: s = 7 + 1 = s + 4, short 7 1 7, int 8, int 1, int short s 4

Beispiel: s = 7 + 1 = s + 4, short 8, short 7 1 7, int 8, int 1, int short s 8

Beispiel: s = 7 + 1 = s + 4, short 8, short 7 1 7, int 8, int compile-time constant expression 1, int short s 8

Expliziter Typecast symbol name type L/R level (type) typecast zahl, char rechts 3 Beispiele mit Datenverlust short s = ( short ) 23343445; Die obersten bits werden einfach weggeworfen... double d = 1. 5; short s = ( short ) d ; d hat danach den Wert 1....ohne Datenverlust: i n t x = 5; short s = ( short ) x ;

5.4 Arrays Oft müssen viele Werte gleichen Typs gespeichert werden. Idee: Lege sie konsekutiv ab! Greife auf einzelne Werte über ihren Index zu! Feld: Index: 17 3-2 9 0 1 0 1 2 3 4 5 5.4 Arrays Harald Räcke 114/656

Beispiel 1 i n t [ ] a ; // Deklaration 2 i n t n = read ( ) ; 3 4 a = new i n t [ n ] ; // Anlegen des Felds 5 i n t i = 0; 6 while ( i < n ) { 7 a [ i ] = read ( ) ; 8 i = i +1; 9 } Einlesen eines Feldes 5.4 Arrays Harald Räcke 115/656

Beispiel type[] name; deklariert eine Variable für ein Feld (array), dessen Elemente vom Typ type sind. Alternative Schreibweise: type name[]; Das Kommando new legt ein Feld einer gegebenen Größe an und liefert einen Verweis darauf zurück: a a = new int[6]; a 0 0 0 0 0 0 5.4 Arrays Harald Räcke 116/656

Was ist eine Referenz? Eine Referenziable speichert eine Adresse; an dieser Adresse liegt der eigentliche Inhalt der Variablen. a: Adresse. 0000 0127 0000 0128 Inhalt. 0000 012C a 4 3 0 9 0000 0129 0000 012A Wir können die Referenz nicht direkt manipulieren (nur über den new-operator, oder indem wir eine andere Referenz zuweisen). 0000 012B 0000 012C 0000 012D 0000 012E 0000 0004 0000 0003 0000 0000 0000 012F 0000 0009 0000 0130..

5.4 Arrays Der Wert einer Feld-Variable ist also ein Verweis!!! int[] b = a; kopiert den Verweis der Variablen a in die Variable b: a int[] b = a; a b Alle nichtprimitive Datentypen sind Referenzentypen, d.h., die zugehörige Variable speichert einen Verweis!!! 5.4 Arrays Harald Räcke 118/656

5.4 Arrays Die Elemente eines Feldes sind von 0 an durchnummeriert. Die Anzahl der Elemente des Feldes name ist name.length. Auf das i-te Element greift man mit name[i] zu. Bei jedem Zugriff wird überprüft, ob der Index erlaubt ist, d.h. im Interl {0,..., name.length-1} liegt. Liegt der Index außerhalb des Interls, wird eine ArrayIndexOutOfBoundException ausgelöst ( Exceptions). 5.4 Arrays Harald Räcke 119/656

Mehrdimensionale Felder Java unterstützt direkt nur eindimensionale Felder. ein zweidimensionales Feld ist ein Feld von Feldern... a a = new int[5][6]; a

Der new-operator symbol name types L/R level new new Typ, Konstruktor links 1 Erzeugt ein Objekt/Array und liefert eine Referenz darauf zurück. 1. Version: Erzeugung eines Arrays (Typ ist Arraytyp) new int[3][7]; oder auch new int[3][]; (ein Array, das 3 Verweise auf int enthält) new String[10]; new int[]{1,2,3,}; (ein Array mit den ints 1, 2, 3) 2. Version: Erzeugung eines Objekts durch Aufruf eines Konstruktors String s = new String("Hello World!");

Der Index-Operator symbol name types L/R level [] index array, int links 1 Zugriff auf ein Arrayelement. 5.4 Arrays Harald Räcke 122/656

Beispiel: x = a[3][2] x = a [ 3 ] [ 2 ]

Beispiel: x = a[3][2] x = a [ 3 ] [ 2 ]

Beispiel: x = a[3][2] x = a [ 3 ] [ 2 ]

Beispiel: x = a[3][2] x = [ ] [ 2 ] a 3

Beispiel: x = a[3][2] x = [ ] [ 2 ] a 3

Beispiel: x = a[3][2] x = [ ] [ ] 2 a 3

Beispiel: x = a[3][2] x = [ ] [ ] 2 a 3

Beispiel: x = a[3][2] = x [ ] [ ] 2 a 3

Beispiel: x = a[3][2] = x [ ] [ ] 2 a 3 x 2 a 1 2 3 4 5 6 0 9 8 3 4 4 9 7 4 6 0 6 2 5 6 4 2 3 5 0 1 2 8 3

Beispiel: x = a[3][2] = x [ ] [ ] 2 a 3 x 2 a 1 2 3 4 5 6 0 9 8 3 4 4 9 7 4 6 0 6 2 5 6 4 2 3 5 0 1 2 8 3

Beispiel: x = a[3][2] = x [ ] 2, int [ ] 2 a 3 x 2 a 1 2 3 4 5 6 0 9 8 3 4 4 9 7 4 6 0 6 2 5 6 4 2 3 5 0 1 2 8 3

Beispiel: x = a[3][2] = x [ ] 2, int [ ] 2 a 3 x 2 a 1 2 3 4 5 6 0 9 8 3 4 4 9 7 4 6 0 6 2 5 6 4 2 3 5 0 1 2 8 3

Beispiel: x = a[3][2] = x [ ] 2, int [ ] 2 a 3, int[][] x 2 a 1 2 3 4 5 6 0 9 8 3 4 4 9 7 4 6 0 6 2 5 6 4 2 3 5 0 1 2 8 3

Beispiel: x = a[3][2] = x [ ] 2, int [ ] 2 a 3, int[][] x 2 a 1 2 3 4 5 6 0 9 8 3 4 4 9 7 4 6 0 6 2 5 6 4 2 3 5 0 1 2 8 3

Beispiel: x = a[3][2] = x [ ] 2, int [ ] 2 a 3, int[][] 3, int x 2 a 1 2 3 4 5 6 0 9 8 3 4 4 9 7 4 6 0 6 2 5 6 4 2 3 5 0 1 2 8 3

Beispiel: x = a[3][2] = x [ ] 2, int [ ] 2 a 3, int[][] 3, int x 2 a 1 2 3 4 5 6 0 9 8 3 4 4 9 7 4 6 0 6 2 5 6 4 2 3 5 0 1 2 8 3

Beispiel: x = a[3][2] = x [ ] 2, int, int[] [ ] 2 a 3, int[][] 3, int x 2 a 1 2 3 4 5 6 0 9 8 3 4 4 9 7 4 6 0 6 2 5 6 4 2 3 5 0 1 2 8 3

Beispiel: x = a[3][2] = x [ ] 2, int, int[] [ ] 2 a 3, int[][] 3, int x 2 a 1 2 3 4 5 6 0 9 8 3 4 4 9 7 4 6 0 6 2 5 6 4 2 3 5 0 1 2 8 3

Beispiel: x = a[3][2] = x [ ] 2, int [ ] a 3, int[][], int[] 3, int 2 2, int x 2 a 1 2 3 4 5 6 0 9 8 3 4 4 9 7 4 6 0 6 2 5 6 4 2 3 5 0 1 2 8 3

Beispiel: x = a[3][2] = x [ ] 2, int [ ] a 3, int[][], int[] 3, int 2 2, int x 2 a 1 2 3 4 5 6 0 9 8 3 4 4 9 7 4 6 0 6 2 5 6 4 2 3 5 0 1 2 8 3

Beispiel: x = a[3][2] = x [ ] 2, int [ ] a 3, int[][], int[] 3, int 6, int 2 2, int x 2 a 1 2 3 4 5 6 0 9 8 3 4 4 9 7 4 6 0 6 2 5 6 4 2 3 5 0 1 2 8 3

Beispiel: x = a[3][2] = x [ ] 2, int [ ] a 3, int[][], int[] 3, int 6, int 2 2, int x 2 a 1 2 3 4 5 6 0 9 8 3 4 4 9 7 4 6 0 6 2 5 6 4 2 3 5 0 1 2 8 3

Beispiel: x = a[3][2] = x [ ] 2, int [ ] a 3, int[][] 6, int, int[] 3, int 6, int 2 2, int x 6 a 1 2 3 4 5 6 0 9 8 3 4 4 9 7 4 6 0 6 2 5 6 4 2 3 5 0 1 2 8 3

Der. -Operator symbol name types L/R level. member access Array/Objekt/Class, Member links 1 Zugriff auf Member. Beispiel: x = new int[2][4].length x hat dann den Wert 2. 5.4 Arrays Harald Räcke 124/656

Beispiel: new int[2][4].length Das Parsing für den new-operator passt nicht in das Schema: new int [ 2 ] [ 4 ]. length

Beispiel: new int[2][4].length Das Parsing für den new-operator passt nicht in das Schema: new int [ 2 ] [ 4 ]. length

Beispiel: new int[2][4].length Das Parsing für den new-operator passt nicht in das Schema: new int [ 2 ] [ 4 ]. length

Beispiel: new int[2][4].length Das Parsing für den new-operator passt nicht in das Schema: new. length int int[2][4] [ 2 ] [ 4 ]

Beispiel: new int[2][4].length Das Parsing für den new-operator passt nicht in das Schema: new. length int int[2][4] [ 2 ] [ 4 ]

Beispiel: new int[2][4].length Das Parsing für den new-operator passt nicht in das Schema:. new length int int[2][4] [ 2 ] [ 4 ]

Arrayinitialisierung 1. int[] a = new int[3]; a[0] = 1; a[1] = 2; a[2] = 3; 2. int[] a = new int[]{ 1, 2, 3}; 3. int[] a = new int[3]{ 1, 2, 3}; 4. int[] a = { 1, 2, 3}; 5. char[][] b = { { a, b }, new char[3], {} }; 6. char[][] b; b = new char[][]{ { a, b }, new char[3], {} }; 7. char[][] b; b = { { a, b }, new char[3], {} }; 5.4 Arrays Harald Räcke 126/656

5.5 Mehr Kontrollstrukturen Typische Form der Iteration über Felder: Initialisierung des Laufindex; while-schleife mit Eintrittsbedingung für den Rumpf; Modifizierung des Laufindex am Ende des Rumpfs. 5.5 Mehr Kontrollstrukturen Harald Räcke 127/656

Beispiel 1 i n t result = a [ 0 ] ; 2 i n t i = 1; // I n i t i a l i s i e r u n g 3 while ( i < a. length ) { 4 i f ( a [ i ] < result ) 5 result = a [ i ] ; 6 i = i +1; // Modifizierung 7 } 8 write ( result ) ; Bestimmung des Minimums 5.5 Mehr Kontrollstrukturen Harald Räcke 128/656

Das For-Statement 1 i n t result = a [ 0 ] ; 2 for ( i n t i = 1; i < a. length ; ++ i ) 3 i f ( a [ i ] < result ) 4 result = a [ i ] ; 5 write ( result ) ; Bestimmung des Minimums 5.5 Mehr Kontrollstrukturen Harald Räcke 129/656

Das For-Statement for ( i n i t, cond, modify ) stmt entspricht: { i n i t ; while ( cond ) { stmt modify ; } } Erläuterungen: ++i; ist äquient zu i = i + 1; die while-schleife steht innerhalb eines Blocks ({...}) die Variable i ist außerhalb dieses Blocks nicht sichtbar/zugreifbar 5.5 Mehr Kontrollstrukturen Harald Räcke 130/656

5.6 Funktionen und Prozeduren Oft möchte man: Teilprobleme separat lösen; und dann die Lösung mehrfach verwenden. 5.6 Funktionen und Prozeduren Harald Räcke 131/656

Beispiel public s t a t i c i n t [ ] readarray ( i n t number) { // number = Anzahl zu lesender Elemente i n t [ ] result = new i n t [number ] ; // Feld anlegen for ( i n t i = 0; i < number; ++ i ) { result [ i ] = read ( ) ; } return result ; } Einlesen eines Feldes

Beispiel Type des Rückgabewertes public s t a t i c i n t [ ] readarray ( i n t number) { // number = Anzahl zu lesender Elemente i n t [ ] result = new i n t [number ] ; // Feld anlegen for ( i n t i = 0; i < number; ++ i ) { result [ i ] = read ( ) ; } return result ; } Einlesen eines Feldes

Beispiel Funktionsname Type des Rückgabewertes public s t a t i c i n t [ ] readarray ( i n t number) { // number = Anzahl zu lesender Elemente i n t [ ] result = new i n t [number ] ; // Feld anlegen for ( i n t i = 0; i < number; ++ i ) { result [ i ] = read ( ) ; } return result ; } Einlesen eines Feldes

Beispiel Funktionsname Type des Rückgabewertes Liste der formalen Parameter public s t a t i c i n t [ ] readarray ( i n t number) { // number = Anzahl zu lesender Elemente i n t [ ] result = new i n t [number ] ; // Feld anlegen for ( i n t i = 0; i < number; ++ i ) { result [ i ] = read ( ) ; } return result ; } Einlesen eines Feldes

Beispiel Funktionsname Type des Rückgabewertes Liste der formalen Parameter public s t a t i c i n t [ ] readarray ( i n t number) { // number = Anzahl zu lesender Elemente i n t [ ] result = new i n t [number ] ; // Feld anlegen for ( i n t i = 0; i < number; ++ i ) { result [ i ] = read ( ) ; } return result ; } Einlesen eines Feldes Funktionsrumpf

Beispiel Funktionsname Type des Rückgabewertes Liste der formalen Parameter public s t a t i c i n t [ ] readarray ( i n t number) { // number = Anzahl zu lesender Elemente i n t [ ] result = new i n t [number ] ; // Feld anlegen for ( i n t i = 0; i < number; ++ i ) { result [ i ] = read ( ) ; } return result ; } Einlesen eines Feldes Rückgabe des Ergebnisses + Beenden der Funktion Funktionsrumpf

5.6 Funktionen und Prozeduren Erläuterungen: Die erste Zeile ist der Header der Funktion. public, und static komen später int[] gibt den Typ des Rückgabe-Werts an. readarray ist der Name, mit dem die Funktion aufgerufen wird. Dann folgt (in runden Klammern und komma-separiert) die Liste der formalen Parameter, hier: (int number). Der Rumpf der Funktion steht in geschweiften Klammern. return expr; beendet die Ausführung der Funktion und liefert den Wert von expr zurück. 5.6 Funktionen und Prozeduren Harald Räcke 133/656

5.6 Funktionen und Prozeduren Erläuterungen: Die Variablen, die innerhalb eines Blocks angelegt werden, d.h. innerhalb von { und }, sind nur innerhalb dieses Blocks sichtbar, d.h. benutzbar (lokale Variablen). Der Rumpf einer Funktion ist ein Block. Die formalen Parameter können auch als lokale Variablen aufgefasst werden. Bei dem Aufruf readarray(7) erhält der formale Parameter number den Wert 7 (aktueller Parameter). 5.6 Funktionen und Prozeduren Harald Räcke 134/656

Beispiel public s t a t i c i n t min ( i n t [ ] b) { i n t result = b [ 0 ] ; for ( i n t i = 1; i < b. length ; ++ i ) { i f (b[ i ] < result ) result = b[ i ] ; } return result ; } Bestimmung des Minimums 5.6 Funktionen und Prozeduren Harald Räcke 135/656

Beispiel public class Min extends MiniJava { public s t a t i c i n t [ ] readarray ( i n t number) {... } public s t a t i c i n t min ( i n t [ ] b) {... } // J e t z t kommt das Hauptprogramm public s t a t i c void main ( String [ ] args ) { i n t n = read ( ) ; i n t [ ] a = readarray ( n ) ; i n t result = min ( a ) ; write ( result ) ; } // end of main ( ) } // end of class Min Programm zur Minimumsberechnung 5.6 Funktionen und Prozeduren Harald Räcke 136/656

Beispiel Erläuterungen: Manche Funktionen, deren Ergebnistyp void ist, geben gar keine Werte zurück im Beispiel: write() und main(). Diese Funktionen heißen Prozeduren. Das Hauptprogramm hat immer als Parameter ein Feld args von String-Elementen. In diesem Argument-Feld werden dem Programm Kommandozeilen-Argumente verfügbar gemacht. public class Test extends MiniJava { public s t a t i c void main ( String [ ] args ) { write ( args [0]+ args [ 1 ] ) ; } } // end of class Test 5.6 Funktionen und Prozeduren Harald Räcke 137/656

Beispiel Der Aufruf java Test "Hel" "lo World!" liefert: Hello World! 5.6 Funktionen und Prozeduren Harald Räcke 138/656

5.6 Funktionen und Prozeduren Um die Arbeitsweise von Funktionen zu veranschaulichen erweitern/modifizieren wir die Kontrollflussdiagramme f(x,y) x=f(7,z) return 42 Startknoten der Funktion f Funktionsaufruf Endknoten Für jede Funktion wird ein eigenes Teildiagramm erstellt. Ein Aufrufknoten repäsentiert eine Teilberechnung der aufgerufenen Funktion. 5.6 Funktionen und Prozeduren Harald Räcke 139/656

5.6 Funktionen und Prozeduren Teildiagramm der Funktion min(): min(b) result=b[0] i=1 no i<b.length yes return result no b[i]<result yes result=b[i] i=i+1

5.6 Funktionen und Prozeduren min(b) readarray(number) main(args) n=read() return result; return result; a=readarray(n) result=min(a) write(result) return 5.6 Funktionen und Prozeduren Harald Räcke 141/656

5.6 Funktionen und Prozeduren Aufruf min(b) readarray(number) main(args) n=read() return result; return result; Rückkehr a=readarray(n) result=min(a) write(result) return 5.6 Funktionen und Prozeduren Harald Räcke 141/656

5.6 Funktionen und Prozeduren Aufruf min(b) readarray(number) main(args) n=read() return result; return result; a=readarray(n) result=min(a) write(result) Rückkehr return 5.6 Funktionen und Prozeduren Harald Räcke 141/656