Elementare Datentypen - Uni Bremenroefer/pi1help/2.pdf · Einführung in die Programmierung mit...

Preview:

Citation preview

Einführung in die Programmierung mit Java 37

Universität Bremen

Elementare Datentypen

� Datentyp Default Speicherplatz Wertebereich� byte 0 1 Byte (8 Bits) -128 bis 127

� short 0 2 Bytes (16 Bits) -32768 bis 32767

� int 0 4 Bytes (32 Bits) -2147483648 bis 2147483647

� long 0 8 Bytes (64 Bits) -9223372036854775808 bis9223372036854775807

� float 0.0 4 Bytes (32 Bits) ±1.40239846E-45 bis±3.40282347E+38

� double 0.0 8 Bytes (64 Bits) ±4.94065645841246544E-324 bis±1.79769313486231570E+308

� boolean false ? (min. 1 Bit) false, true

� char '\u0000' 2 Bytes (16 Bits) '\u0000' bis '\uFFFF'

Einführung in die Programmierung mit Java 38

Universität Bremen

Ganzzahlige Datentypen

� Zahlensysteme

� Dezimal, es gibt die Ziffern 0 bis 9 44 22

11 0011 000011

55 22

22 AA

32+8+232+8+2=

5*8+25*8+2=

2*16+102*16+10=

� Binär, nur die Ziffern 0 und 1

� Oktal, nur die Ziffern 0 bis 7

� Hexadezimal, die Ziffern 0 bis 9 und A bis F

� Literale� Dezimal: 42, +42, -42, 42L, 42l

� Oktal: 052, +052, -052, 052L, 052l� Hexadezimal: 0x2A, +0x2a, -0x2A, 0x2aL, 0x2Al

4*10+24*10+2=

Ein L am Ende bedeutet long

Ein L am Ende bedeutet long

Einführung in die Programmierung mit Java 39

Universität Bremen

Fließkommazahlen

� Format

Ein F am Ende bedeutet float, ein D double. Wird nichts an-gegeben, ist der Typ double

Ein F am Ende bedeutet float, ein D double. Wird nichts an-gegeben, ist der Typ double

11 77EE ++551111 4422 ..44--

� Exponent

� Wert = Mantisse × 10Exponent

� Literale� Float: 0.0f, .382f, 3.1415F, -3.1415f, 17E7f, 17e-7f, 17E+7F� Double: 0.0, .0392039029303, -3.141592653589d, 1E+100

� Mantisse

Einführung in die Programmierung mit Java 40

Universität Bremen

Zeichen

� Literale� Normal: 'a', 'b', 'c'

� Wagenrücklauf: '\r'

Java-Quelltexte werden im Unicode verarbeitet. An jeder Stelle kann \uXXXX stehen.

Java-Quelltexte werden im Unicode verarbeitet. An jeder Stelle kann \uXXXX stehen.

f\u006fr(int i = 0; i < 10; ++i)f\u006fr(int i = 0; i < 10; ++i)

for(int i = 0; i < 10; ++i)for(int i = 0; i < 10; ++i)

=\ = Escape-Zeichen\ = Escape-Zeichen

� Zeilenvorschub: '\n'� Seitenvorschub: '\f'� Tabulatorsprung: '\t'

� Backspace: '\b'� Hochkomma: '\''� Backslash: '\\'

� Unicode Zeichen: '\u12ab'

Einführung in die Programmierung mit Java 41

Universität Bremen

Zeichenketten

� String ist eine Klasse, kein Basistyp� Daher kann man Ausdrücke schreiben, wie z.B. s.equals("Hallo")

� Literale� "Hallo", "wie geht's?"

� "Ich sage \"mir geht's gut\"" → Ich sage "Mir geht's gut"

� Beispiele� System.out.println("\"DM\"\t\"Euro\"\n1\t0,51");� "DM" "Euro"

1 0,51

In String-Literalen können alle Escape-Sequenzen aus char-Literalen verwendet werden

In String-Literalen können alle Escape-Sequenzen aus char-Literalen verwendet werden

Einführung in die Programmierung mit Java 42

Universität Bremen

Typkonvertierung

� Automatisch� byte → short → int → long → float → double

� Manuell� byte b; short s; int i; long l; float f = 1.5; double d = -1.5; char c;

� b = (byte) f; (b == 1)� f = (float) 178.2� l = (int) d; (l == -2)

� c = (char) 32

� char

Bei der Typumwandlung von double/float in einen Ganzzahltyp wird immer abgerundet

Bei der Typumwandlung von double/float in einen Ganzzahltyp wird immer abgerundet

� Durch Funktionen� String s = Integer.toString(i);� i = Integer.parseInt(s);� d = Double.parseDouble(s);

Einführung in die Programmierung mit Java 43

Universität Bremen

Wrapper-Klassen

� Datentyp Wrapper� byte Byte

� short Short� int Integer� long Long

� float Float� double Double� boolean Boolean

� char Character

� Datentyp Wrapper� byte Byte

� short Short� int Integer� long Long

� float Float� double Double� boolean Boolean

� char Character

� Generell� Wrapper.MAX_VALUE

� z.B. Byte.MAX_VALUE

� Wrapper.MIN_VALUE� Wrapper.parseWrap(String s)

� z.B. Integer.parseInt("1234");

� Wrapper.toString(type t)� z.B. Integer.toString(1234);

� Float und Double� Wrapper.NEGATIVE_INFINITY

� z.B. Double.NEGATIVE_INFINITY

� Wrapper.POSITIVE_INFINITY

� Wrapper.NaN

� Generell� Wrapper.MAX_VALUE

� z.B. Byte.MAX_VALUE

� Wrapper.MIN_VALUE� Wrapper.parseWrap(String s)

� z.B. Integer.parseInt("1234");

� Wrapper.toString(type t)� z.B. Integer.toString(1234);

� Float und Double� Wrapper.NEGATIVE_INFINITY

� z.B. Double.NEGATIVE_INFINITY

� Wrapper.POSITIVE_INFINITY

� Wrapper.NaN

Einführung in die Programmierung mit Java 44

Universität Bremen

Nachschlagen in der Dokumentation

Einführung in die Programmierung mit Java 45

Universität Bremen

int boolean String

i b s

Variablen

7 true "Hallo"

� Richtig� int i = 7;� boolean b = true;� String s = "Hallo";

� Falsch� boolean b = 7;� boolean b = "Hallo";

Einführung in die Programmierung mit Java 46

Universität Bremen

Konstanten

� Allgemein� Konstanten sind benannte Literale, können also überall verwendet werden, wo auch

Literale zulässig sind (z.B. hinter case in der switch-Anweisung)� Im Gegensatz zu Variablen kann sich der Wert einer Konstanten niemals ändern

� Beispiel:� final int IS_NUMBER = 1,

IS_KEYWORD = 2;:

switch(type){

case IS_NUMBER::

case IS_KEYWORD::

}

Einführung in die Programmierung mit Java 47

Universität Bremen

Bezeichner für Variablen/Konstanten

� Erstes Zeichen muss ein Buchstabe, '_' oder '$' sein� Alle weiteren Zeichen können Buchstaben, Ziffern, '_' oder '$' sein� Für Variablen keine Bezeichner von Schlüsselwörtern verwenden

� abstract default if private throwboolean do implements protected throwsbreak double import public transientbyte else instanceof return trycase extends int short voidcatch final interface static volatilechar finally long super whileclass float native switchconst for new synchronizedcontinue goto package this

� Groß- und Kleinschreibung wird unterschieden

Einführung in die Programmierung mit Java 48

Universität Bremen

Konventionen für Bezeichner

� Variablen� Für Laufvariablen in Schleifen: i, j� Für die Argumente von main: args� Variablen beginnen mit Kleinbuchstaben: stream

� Mehrere Worte werden durch Großbuchstabenaneinander gefügt: thisIsAVeryLongName

� '_' und '$' werden nicht verwendet

� Konstanten� Nur Großbuchstaben, Ziffern und '_' MAX_WORDS, Math.PI

� Klassen� Genau wie Variablen, beginnen aber mit einem System, Greetings

Großbuchstaben

Einführung in die Programmierung mit Java 49

Universität Bremen

Lebenszeit/Sichtbarkeit

� Lebenszeit� In Funktionen bis Ende des aktuellen Blocks {...}

� Ausnahme: Funktionsparameter� void f(int a) {...} ist eigentlich void f { (int a) {...} }

� Ausnahme: Definitionen in for� for(int i = 0; i < 10; ++i) {...} ist eigentlich

{ for(int i = 0; i < 10; ++i) {...} }

� Sichtbarkeit, Suchen nach Bezeichner� In Funktion rückwärts, aber nicht in Blöcke hinein� In Funktionsparametern

� In Klasse (auch hinter der aktuellen Funktion)

� Mehrfachdefinitionen� nicht in Funktionen, d.h. void f(int a) {int a; {int a;}} nicht erlaubt

class HideAndSeek{

static int target;static void main(String[] args){System.out.println(target);{int target = 17;System.out.println(target);

}System.out.println(target);

}}

class HideAndSeek{

static int target;static void main(String[] args){System.out.println(target);{int target = 17;System.out.println(target);

}System.out.println(target);

}}

Einführung in die Programmierung mit Java 50

Universität Bremen

Arrays

� Definition� Eine Reihung fester Länge von

Variablen gleichen Typs, auf die mit einem Index zugegriffen werden kann.

� Arrays sind Objekte

� Beispiel� String[.] a = {

"Herbert Pappelbusch","Irene Schmidt","Claudia Miesmuffel",

:"Tobias Kleinemann","Mareike Bumtrupp"

};

Einführung in die Programmierung mit Java 51

Universität Bremen

Eindimensionale Arrays

� Beispiel� String[.] a = new String[50];

a[0] = "Herbert Pappelbusch";a[1] = "Irene Schmidt";a[2] = "Claudia Miesmuffel";

:a[48] = "Tobias Kleinemann";a[49] = "Mareike Bumtrupp";

String s = "Tobias Kleinemann";

for(int i = 0; i < a.length; ++i)if(a[i].equals(s))

System.out.println("Gefunden!");

Einführung in die Programmierung mit Java 52

Universität Bremen

Zweidimensionale Arrays

� Beispiel� String[.][.] a =

{{"Herbert","Pappelbusch","Herr"},{"Irene","Schmidt","Frau"},

:};

for(int i = 0; i < a.length; ++i)System.out.println(a[i][2] + " " +

a[i][0] + " " + a[i][1]);

Einführung in die Programmierung mit Java 53

Universität Bremen

Mehrdimensionale Arrays

� Dimensionen� Eine beliebige Anzahl von Dimensionen ist möglich

� Speicherplatzverbrauch bedenken!

� Ein zweidimensionales Array ist ein Array von Arrays

� Daher können die Arrays in weiteren Dimensionen selbst auch wieder unterschiedliche Größen haben

� Beispiel� int[.][.] a = new int[5][.];

a[0] = new int[3];a[1] = new int[2];a[2] = new int[4];

Einführung in die Programmierung mit Java 54

Universität Bremen

Operatoren

� Stelligkeiten� Unäre Operatoren, z.B die Vorzeichen '+' oder '-'

� Binäre Operatoren, z.B. die Rechenoperationen '+' oder '-'� Trinärer Operator '? :'

� Arten� Vergleichsoperatoren, z.B. '>' oder '<'

� Logische Operatoren, z.B. '&&' oder '||'� Arithmetische Operatoren, z.B. '+' oder '-'� Bit-Operatoren, z.B. '>>' oder '&'

� Zuweisungsoperatoren

� Operatoren können abhängig vom Typ der Operanden unterschiedliche Auswirkungen haben� z.B. ist 1+1 == 2, aber "1"+"1" ergibt "11"

Einführung in die Programmierung mit Java 55

Universität Bremen

Vergleichsoperatoren

� Allgemein� Vergleichsoperatoren liefern immer einen Wahrheitswert (boolean) zurück

� Beide Operanden müssen einen kompatiblen Typ haben

� Numerische Operatoren� Gleichheit: age == 18� Ungleichheit: age != 18

� Größer: age > 18� Größer oder gleich: age >= 18� Kleiner: age < 18

� Kleiner oder gleich: age <= 18

� Für Objekte (z.B. Strings)� Identität: s1 == s2 (Ist s1 dieselbe Zeichenkette wie s2?)� Gleichheit s1.equals(s2) (ist kein Operator sondern eine Funktion)

Einführung in die Programmierung mit Java 56

Universität Bremen

Logische Operatoren

� Allgemein� Logische Operatoren verrechnen ein oder zwei Wahrheitswerte zu einem

neuen Wahrheitswert

� Operatoren� Logisches Nicht: !(age > 18) == (age <= 18)� Logisches Und: age > 18 && age < 65� Logisches Oder: age <= 18 || age >= 65

� Unvollständige Auswertung� if(age > 18 && age < 65) ... entspricht if(age > 18)

if(age < 65) ...� if(age <= 18 || age >= 65) ... entspricht if(age > 18) ...

else if(age < 65) ...� Nützlich z.B. für if(d != 0 && 100 / d > 1)

oder if(d == 0 || 100 / d > 1)

Einführung in die Programmierung mit Java 57

Universität Bremen

Arithmetische Operatoren

� Allgemein� Arithmetische Operatoren verrechnen ein oder zwei Werte zu einem neuen

Wert� Bei zwei Operanden müssen beide einen kompatiblen Typ haben� Der Ergebnistyp ist identisch mit dem „größeren“ Typ der beiden Operanden

� Operatoren� Addition: a + b, 17 + 4, 17 + 4.0

"a" + "b" ("ab"), 17 + "4" ("174"), "17" + 4. ("174.0")

� Subtraktion: a - b, 17 - 4, 17 - 4.0� Multiplikation: a * b, 17 * 4, 17 * 4.0� Division: a / b, 17 / 4 (== 4), 17 / 4.0 (== 4.25)

� Modulo (Divisionsrest): a % b, 17 % 4 (== 1), 17.5 % 4.5 (== 4.0)

Einführung in die Programmierung mit Java 58

Universität Bremen

Arithmetische Operatoren

� Ganzzahlarithmetik� Überlauf ist kein Fehler

� Das Ergebnis wird auf die entsprechende Bit-Anzahl gekappt� Division durch 0 ist nicht erlaubt (erzeugt ArithmeticException: / by zero)

� Fließkommaarithmetik� Division durch 0 ist kein Fehler!

� +x / 0.0 == Double.POSITIVE_INFINITY� -x / 0.0 == Double.NEGATIVE_INFINITY� 0.0 / 0.0 == Double.NaN

� Bei einem Überlauf wird Double.POSITIVE_INFINITY oder Double.NEGATIVE_INFINITY

Einführung in die Programmierung mit Java 59

Universität Bremen

Bit-Operatoren

� Allgemein� Bit-Verknüpfungen können auf Ganzzahltypen und boolean angewendet

werden

� Verknüpfungen� Und 0xea & 0x4c 11 0011 0000111111

00 0011 1100001100

00 0011 0000001100

&

==

� Oder 0xea | 0x4c� Exklusiv-Oder 0xea ^ 0x4c

� Nicht ~0xea

� Verschiebungen� Links 0xea << 3� Rechts 0xea >> 3� Vorzeichenlos rechts 0xea >>> 3

Einführung in die Programmierung mit Java 60

Universität Bremen

Zuweisungsoperatoren

� Zuweisung: i = 7, s = "Hallo" , a[a[i]][2][17] = 42 + ix = y = z = 0, a[x = 7] = 1

� Rechnen und Zuweisung: i += 17, a[a[1]] <<= 4, x *= x� Variable op= ausdruck entspricht Variable = Variable op ausdruck, aber die

Variable wird nur einmal ausgewertet

� Pre-Inkrement/Dekrement: ++i, ++a[5], a[--i] = a[i]� Post-Inkrement/Dekrement: i++, a[5]++, a[i--] = a[i]

� Ein Post-Inkrement/Dekrement verändert den Wert der Variablen, liefert aber den alten Wert als Ergebnis zurück

� int i = 0; int j = 0;a[i++] = 17; b[++j] = 42;a[i++] = 18; b[++j] = 43;

� a[0] == 17, a[1] == 18 b[1] == 42, b[2] == 43

Einführung in die Programmierung mit Java 61

Universität Bremen

Sonstige Operatoren

� If-Else� bedingung ? ausdruck : ausdruck

� z.B. a = b == 0 ? 0 : 100 / b;r = r >= Math.PI

? r - 2 * Math.PI : r < -Math.PI ? r + 2 * PI : r;

� new� new erzeugt neue Objekte oder Arrays

� z.B. int[] a = new int[10];FileInputStream stream = new FileInputStream("aFile");

� Typumwandlung� int a = (int) 3.1415

Einführung in die Programmierung mit Java 62

Universität Bremen

Vorrang von Operatoren

� Bindungsstärke� Was wird zuerst ausgewertet, wenn verschiedene Operatoren in einem

Ausdruck verwendet werden?� z.B. Punkt- vor Strichrechnung: 1 + 2 * 3 = 1 + (2 * 3) = 7

� Assoziativität� Was wird zuerst ausgewertet, wenn Operatoren gleicher Bindungsstärke in

einem Ausdruck verwendet werden?� z.B. links bei Minus: 3 - 2 - 1 = (3 - 2) - 1 = 0

� Beispiel� a = a >> 4 & 0x0f | a << 4 & 0xf0� a = (((a >> 4) & 0x0f) | ((a << 4) & 0xf0)) 11 0011 0000111111

Einführung in die Programmierung mit Java 63

Universität Bremen

Vorrang von Operatoren

� Operator Asso. Beschreibung� .,(),[] links Funktionsaufruf und Array-Index� -,+,!,~,++,-- rechts Vorzeichen, logisches Nicht, arithm. Nicht, In-, Dekrement� new,(typ) rechts Objekterzeugung und Typumwandlung� *,/,% links Multiplikation, Division, Modulo� +,- links Addition und Subtraktion� <<,>>,>>> links Links- und Rechtsverschiebung� <,<=,>,>= Kleiner, Kleiner-Gleich, Größer, Größer-Gleich� ==,!= links Gleichheit und Ungleichheit� & links arithmetisches Und� ^ links arithmetisches Exklusiv Oder� | links arithmetisches Oder� && links logisches Und� || links logisches Oder� ? : links arithmetisches If-Else� =,+=,-=,*=,/=,%=,^= rechts Zuweisung und Rechenzuweisung� &=,|=,<<=,>>=,>>>= rechts Rechenzuweisung

Bin

dung

sstä

rke

Einführung in die Programmierung mit Java 64

Universität Bremen

Ein UPN-Rechner

� Umgekehrte Polnische Notation� Die Operanden kommen zuerst, dann kommt der Operator, z.B. 1 2 +

� Arbeitet als Stack-Maschine: Jeder Operator holt sich seine Operanden von der Spitze des Stapels und legt das Ergebnis wieder dort ab

� Beispiel� Für 1 + 2 * 3 schreibt man: 1 2 3 * +

77+

11

66*

11

22

333

11

222

111

Einführung in die Programmierung mit Java 65

Universität Bremen

Ein UPN-Rechner

Einführung in die Programmierung mit Java 66

Universität Bremen

Ein UPN-Rechner

Recommended