Schleifeninvarianten, Zahlendarstellung und Typanpassungen

Werbung
Themen der Übung
Schleifeninvarianten, Zahlendarstellung und
Typanpassungen
CoMa-Übung V
TU Berlin
1
Organisatorisches
2
Schleifeninvarianten
3
Widerspruchsbeweise
4
Zahlendarstellung in Rechnern
5
Typanpassungen
6
Operatoren
7
Variablen-Gültigkeit
14.11.2012
Neues Tutorium: Do, 10 – 12, MA 645 bei Daniel Kuske
Zu wenig Platz in eurem Tutorium? Do, 10 – 12 passt euch besser?
Geht hin!
CoMa-Übung V (TU Berlin)
Schleifeninvarianten, Zahlendarstellung und Typanpassungen
14.11.2012
1 / 32
Schleifeninvarianten
CoMa-Übung V (TU Berlin)
Schleifeninvarianten, Zahlendarstellung und Typanpassungen
14.11.2012
2 / 32
Schleifeninvarianten (2)
Beispiel: Maximale Komponente eines Vektors
Eine Schleifeninvariante ist eine Eigenschaft einer Schleife in einem
Algorithmus, die zu einem bestimmten Zeitpunkt in jedem
Schleifendurchlauf gültig ist.
maximum(x):
Input: Vektor x ∈ Rn
Output: max{xi | i = 1, . . . , n}
max := −∞
FOR i := 1 TO n DO
IF xi > max THEN
max := xi
ENDIF
ENDFOR
RETURN max
Nutzen von Schleifeninvarianten
Korrektheit von Schleifen / Algorithmen beweisen
Korrektheit von Algorithmen
Ein Algorithmus ist partiell korrekt, wenn er bei Terminierung das
korrekte Ergebnis liefert.
Vorsicht: Jeder nie terminierende Algorithmus ist partiell korrekt!
Korrektheitsbeweis
Ein Algorithmus ist total korrekt, wenn er partiell korrekt ist und
immer terminiert.
Zu zeigen: Variable max hat am Ende den Wert max{xi | i = 1, . . . , n}
Idee: Betrachte den Wert von max nach jedem Durchlauf
CoMa-Übung V (TU Berlin)
Schleifeninvarianten, Zahlendarstellung und Typanpassungen
14.11.2012
3 / 32
CoMa-Übung V (TU Berlin)
Schleifeninvarianten, Zahlendarstellung und Typanpassungen
14.11.2012
4 / 32
Schleifeninvarianten (3)
Schleifeninvarianten (4)
Beispiel: Maximale Komponente eines Vektors
Beispiel: Maximale Komponente eines Vektors
max := −∞
FOR i := 1 TO n DO
IF xi > max THEN
max := xi
ENDIF
ENDFOR
RETURN max
max := −∞
FOR i := 1 TO n DO
IF xi > max THEN
max := xi
ENDIF
ENDFOR
RETURN max
Invarianten
Beweis durch vollständige Induktion über die Anzahl der Iterationen i:
Beweis der Invarianten max(i) = {x1 , . . . , xi }, i = 1, . . . , n
Definiere max(i) := Wert von max nach i-tem Schleifendurchlauf.
Induktionsanfang, i = 1. Wegen xi ∈ R > −∞ ist nach der ersten
Iteration max(1) = x1 = max{x1 }.
Invariante: max(i) = {x1 , . . . , xi }, i = 1, . . . , n
Induktionsvoraussetzung, die Behauptung gelte für i = 1, . . . , k und
ist zu zeigen für i = k + 1.
Nach Terminierung der Schleife gilt i = n, d.h:
max = max(n) = max{x1 , ..., xn }.
CoMa-Übung V (TU Berlin)
Schleifeninvarianten, Zahlendarstellung und Typanpassungen
Induktionsschluss.
14.11.2012
5 / 32
CoMa-Übung V (TU Berlin)
Schleifeninvarianten, Zahlendarstellung und Typanpassungen
Schleifeninvarianten (5)
Schleifeninvarianten (6)
Beispiel: Maximale Komponente eines Vektors
Beweis der Invarianten max(i) = {x1 , . . . , xi }, i = 1, . . . , n
Induktionsanfang, i = 1. Wegen xi ∈ R > −∞ ist nach der ersten
Iteration max(1) = x1 = max{x1 }.
Induktionsvoraussetzung, die Behauptung gelte für i = 1, . . . , k und
ist zu zeigen für i = k + 1.
Beweis der Invarianten max(i) = {x1 , . . . , xi }, i = 1, . . . , n
Induktionsvoraussetzung, die Behauptung gelte für i = 1, . . . , k und ist zu
zeigen für i = k + 1.
Induktionsschluss. Nach Definition des Algorithmus gilt:
(
max(k) = max{x1 , . . . , xk } falls max(k) ≥ xk+1
max(k + 1) =
xk+1
falls max(k) < xk+1
14.11.2012
Induktionsschluss. Nach Definition des Algorithmus gilt:
(
max(k) = max{x1 , . . . , xk } falls max(k) ≥ xk+1
max(k + 1) =
xk+1
falls max(k) < xk+1
Damit folgt: max(k + 1) = max{max(k), xk+1 }
Damit folgt max(k + 1) = max{max(k), xk+1 } und nach IV ist
max{max(k), xk+1 } = max{max{x1 , . . . , xk }, xk+1 } = max{x1 , . . . , xk+1 }.
Schleifeninvarianten, Zahlendarstellung und Typanpassungen
6 / 32
Beweis durch vollständige Induktion über die Anzahl der Iterationen i:
FOR i := 1 TO n DO
IF xi > max THEN max := xi ENDIF
ENDFOR
CoMa-Übung V (TU Berlin)
14.11.2012
7 / 32
= max{max{x1 , . . . , xk }, xk+1 }
= max{x1 , . . . , xk+1 }
Es gilt damit: max = max(n) = max{x1 , . . . , xn }.
CoMa-Übung V (TU Berlin)
Schleifeninvarianten, Zahlendarstellung und Typanpassungen
14.11.2012
8 / 32
Widerspruchsbeweise
Widerspruchsbeweise
Ein Widerspruchsbeweis (auch indirekter Beweis oder reductio ad
absurdum genannt) folgt einer Beweistechnik, die nach folgendem Schema
vorgeht:
Beispiel
Behauptung: Ist n2 für ein n ∈ N gerade, so ist n gerade.
Nimm das logische Gegenteil dessen an, was bewiesen werden soll.
Annahme für den Widerspruchsbeweis: Sei n2 für ein n ∈ N gerade
und n ungerade.
Leite aus dieser Annahme einen Widerspruch her.
n ungerade ⇒ ∃k ∈ N : n = 2k + 1
Ist die Annahme wahr, wäre also auch der Widerspruch wahr.
⇒ n2 = (2k + 1)2 = 4k 2 + 4k + 1 = 2(2k 2 + 2k) + 1
Da ein Widerspruch niemals wahr sein kann, muss die Annahme falsch
sein.
n2 ist ungerade → Widerspruch zu n2 gerade!
Zusammenfassung
Somit ist das logische Gegenteil der Annahme wahr.
Widerspruchsannahme treffen.
Beispiel
Mit Widerspruchsannahme und den Voraussetzungen der Behauptung
schlussfolgern.
Ist n2 für ein n ∈ N gerade, so ist n gerade.
Annahme für den Widerspruchsbeweis: Sei n2 für ein n ∈ N gerade
und n ungerade.
CoMa-Übung V (TU Berlin)
Schleifeninvarianten, Zahlendarstellung und Typanpassungen
14.11.2012
Widerspruch herleiten.
Fertig.
9 / 32
Widerspruchsbeweise
Beispiel
Behauptung:
√
n
m
14.11.2012
10 / 32
Positionelle Zahlensysteme
2 ist irrational.
Zahlensysteme werden zur Darstellung von Zahlen verwendet. Wir
verwenden positionelle Systeme, in denen die Wertigkeit einer Ziffer von
ihrer Position abhängt.
21 = 2 · 101 + 1
(Jede positive rationale Zahl lässt sich als Quotient zweier teilerfremden,
natürlichen Zahlen schreiben.)
2=
Schleifeninvarianten, Zahlendarstellung und Typanpassungen
Zahlensysteme
√
Annahme für den Widerspruchsbeweis: 2 ist rational.
√
√
n
2 ist rational ⇒ ∃n, m ∈ N : 2 = m
, ggT (n, m) = 1
√
CoMa-Übung V (TU Berlin)
⇒2=
n2
m2
Hinweis:
⇒ 2m2 = n2
Nicht alle Zahlensysteme sind positionell.
2m2 = n2 ⇒ n2 ist gerade
n2 ist gerade ⇒ n ist gerade ⇒
n
2
Das römische Zahlensystem ist z.B. additiv – alle Ziffern werden
addiert (sofern keine Subtraktionsregel benutzt wird).
∈N
(Ist n2 für ein n ∈ N gerade, so ist n gerade.)
2
n2
⇒ m2 = n2
m2
m2 ist gerade ⇒
XXI = 10 + 10 + 1 = 21
n 2
2
2=
=2·
⇒
m ist gerade
Hybride Systeme sind in Asien weit verbreitet:
= 2 · 10 + 1 = 21
⇒ ggT (m, n) ≥ 2 → Widerspruch zu ggT (n, m) = 1!
CoMa-Übung V (TU Berlin)
Schleifeninvarianten, Zahlendarstellung und Typanpassungen
14.11.2012
11 / 32
CoMa-Übung V (TU Berlin)
Schleifeninvarianten, Zahlendarstellung und Typanpassungen
14.11.2012
12 / 32
Zahlensysteme (2)
Zahlensysteme (3)
Basen
Basen und Ziffern
In positionellen Zahlensystemen kommen die Ziffern aus einer endlichen
Menge {0, 1, . . . , b − 1} für ein b ∈ N, b > 2. b heißt Basis des Systems.
In einem Zahlensystem mit Basis b gibt es die Ziffern 0, 1, . . . , b − 1.
Eine Zahl an an−1 . . . a0 zur Basis b steht dann für
n
X
ai · b i = an · b n + an−1 · b n−1 + · · · + a0 · b 0
Im Oktalsystem (Basis 8) gibt es die Ziffern 0, 1, 2, 3, 4, 5, 6, 7.
Im Biärsystem (Basis 2) gibt es die Ziffern 0, 1.
i=0
Zählen in anderen Systemen
Gebräuchliche Basen
Dezimal
0
1
2
3
4
5
Im Alltag gebräuchlich ist das Dezimalsystem mit der Basis 10.
2110 = 2 · 101 + 1 · 100
Computer benutzen das Binärsystem mit der Basis 2.
101012 = 1 · 24 + 0 · 23 + 1 · 22 + 0 · 21 + 1 · 20 = 2110
CoMa-Übung V (TU Berlin)
Schleifeninvarianten, Zahlendarstellung und Typanpassungen
14.11.2012
13 / 32
Darstellen von Zahlen in Rechnern
Nicht-negative Ganzzahlen werden von Rechnern als Binärzahlen mit einer
festen Anzahl Stellen gespeichert. Beispiele (mit 8 festen Stellen):
510 = 1 · 22 + 0 · 21 + 1 · 20 = 000001012
810 = 1 ·
+0·
+0·
+1·
24
21
+0·
23
20
CoMa-Übung V (TU Berlin)
Binär
0
1
10
11
100
101
Dezimal
6
7
8
9
10
11
Oktal
6
7
10
11
12
13
Schleifeninvarianten, Zahlendarstellung und Typanpassungen
Binär
110
111
1000
1001
1010
1011
14.11.2012
Überläufe
Durch die feste Anzahl Stellen können bei Rechnungen zu Zahlen
entstehen, die außerhalb des Wertebereichs liegen.
= 000010002
1610 · 1610 = 000100002 · 000100002 = 1000000002 = 25610
22
→ wird zu 000000002 = 010 abgeschnitten.
Dieses Ereignis wird Überlauf genannt.
Negative Ganzzahlen
Bei Überläufen das Vorzeichen überschrieben,
Negative von positiven Zahlen unterscheiden braucht ein Vorzeichen.
und alle Stellen außerhalb des Wertebereichs abgeschnitten.
Rechner haben nur 0 und 1 → erste Ziffer dient als Vorzeichen,
Vorsicht
0 für +, 1 für -.
Java gibt bei Überläufen keinen Fehler aus!
Negative Zahlen werden im Zweierkomplement gespeichert,
Aufgabe des Menschen, ausreichend große Datentypen zu verwenden.
was dem Rechner arithmetische Operationen erleichtert.
CoMa-Übung V (TU Berlin)
Schleifeninvarianten, Zahlendarstellung und Typanpassungen
14 / 32
1610 = 1 · 24 + 0 · 23 + 0 · 22 + 0 · 21 + 0 · 20 = 000100002
+ 1 · + 1 · + 1 · 21 + 1 · 20 = 001111112
P7
Mit 8 Stellen ist 255 = i=0 2i = 28 − 1 die größte darstellbare Zahl.
6310 = 1 ·
25
22
Oktal
0
1
2
3
4
5
Darstellen von Zahlen in Rechnern (2)
Nicht-negative Ganzzahlen
23
Im Dezimalsystem (Basis 10) gibt es die Ziffern 0, 1, 2, 3, 4, 5, 6, 7, 8, 9.
14.11.2012
15 / 32
CoMa-Übung V (TU Berlin)
Schleifeninvarianten, Zahlendarstellung und Typanpassungen
14.11.2012
16 / 32
Darstellen von Zahlen in Rechnern (3)
Double
Gleitkommazahlen
Besonderheiten von double
Gleitkommazahlen haben einen sehr großen Wertebereich (ca. ±9 · 10308
für double). Erreicht wird das durch eine Exponentialdarstellung der Form
Double besitzt die Möglichkeit,
−∞ darzustellen (Double.NEGATIVE INFINITY),
Vorzeichen · Mantisse · 2Exponent
+0.0 und −0.0 (es gilt +0.0 == −0.0),
Der Exponent ist eine Ganzzahl mit einer festen Anzahl Stellen.
sowie nicht definierte Ergebnisse (Double.NaN – Not a Number).
Die Mantisse ist eine Zahl ∈ [1, 2) mit einer festen Anzahl
Nachkommastellen.
Unendlich
Double.POSITIVE INFINITY / Double.NEGATIVE INFINITY treten auf,
Exponent und Mantisse werden als Binärzahlen gespeichert.
Datentyp
float
double
CoMa-Übung V (TU Berlin)
Vorzeichen
ja
ja
Exponent
8 Stellen
11 Stellen
wenn bei einer Berechnung ein Ergebnis auftritt, was außerhalb des
Wertebereichs von Double liegt,
Mantisse
23 Stellen
52 Stellen
Schleifeninvarianten, Zahlendarstellung und Typanpassungen
+∞ darzustellen (Double.POSITIVE INFINITY),
bei Division durch +0.0 bzw. −0.0.
Vergleiche und arithmetische Operationen funktionieren mit diesen
Konstanten.
14.11.2012
17 / 32
CoMa-Übung V (TU Berlin)
Schleifeninvarianten, Zahlendarstellung und Typanpassungen
Double (2)
Literale
Not a Number
Der Standardfall
Double.NaN stellt das Ergebnis einer nicht-definierten Berechnung dar.
Dazu gehören:
Normalerweise intepretiert Java Zahlen als int oder double.
14.11.2012
18 / 32
int: Jede Ziffernfolge ohne Dezimalpunkt (.) und ohne
Exponentialschreibweise (e/E): 12, -1
0.0/0.0,
Math.sqrt(-1),
double: Jede Ziffernfolge mit Dezimalpunkt (.) oder mit
Exponentialschreibweise (e/E): 1.0, 10e2
Double.POSITIVE INFINITY * 0,
Double.POSITIVE INFINITY + Double.NEGATIVE INFINITY.
Explizite Typangabe
Vergleiche mit Double.NaN
Man kann Java zwingen, ein Literal (oder Variable) als bestimmten Typ zu
interpretieren. Dazu schreibt man (typ) vor das Literal / die Variable.
Double.NaN == d ist für jeden double d falsch,
insbesondere ist Double.NaN == Double.NaN auch false.
(byte) 1 ist vom Typ byte,
Double.NaN != d ist für jeden double d wahr,
(short) 1 ist vom Typ short,
auch Double.NaN != Double.NaN ist true.
(int) 1 ist vom Typ int,
<, >, <=, >= verhalten sich wie ==.
...
CoMa-Übung V (TU Berlin)
Schleifeninvarianten, Zahlendarstellung und Typanpassungen
14.11.2012
19 / 32
CoMa-Übung V (TU Berlin)
Schleifeninvarianten, Zahlendarstellung und Typanpassungen
14.11.2012
20 / 32
Literale (2)
Typanpassung
Affixe
Java bietet sieben primitive Datentypen für Zahlen. Welchen Typ hat das
Ergebnis, wenn man mit Zahlen mit unterschiedlichen Typen rechnet?
Um Zahlen als long, float oder double zu deklarieren, gibt es die
Möglichkeit, einen Buchstaben als Affix anzuhängen.
Typanpassung bei Operationen
Operanden der Typen byte und short werden automatisch in int
umgewandelt.
l oder L für long: 10l, 67L
f oder F für float: 10f, 67F
Das Ergebnis einer Operation hat dann denselben Typ wie der größte
Operand (größte im Bezug auf seinen Wertebereich).
d oder D für double: 10d, 67D
0 → 65535
Präfixe für andere Zahlensysteme
Java erlaubt es, Zahlen als Binär- (Basis 2), Octal- (Basis 8) oder
Hexadezimalzahl (Basis 16) einzugeben. Dies wird durch Präfixe realisiert:
0b oder 0B für das Binärsystem.
0 für das Oktalsystem – 010 steht also für 8, nicht 10!
Schleifeninvarianten, Zahlendarstellung und Typanpassungen
byte
short
−128 → 127
−32768 → 32767
long
int
9
ca. ±2 · 10
ca. ±9 · 10
float
18
double
38
ca. ±3.4 · 10
ca. ±1.8 · 10308
Für einen int i und einen double d ist das Ergebnis i + d also
vom Typ double.
0x oder 0X für das Hexadezimalsystem.
CoMa-Übung V (TU Berlin)
char
14.11.2012
21 / 32
Typanpassung – Beispiele
CoMa-Übung V (TU Berlin)
Schleifeninvarianten, Zahlendarstellung und Typanpassungen
14.11.2012
22 / 32
Typanpassung – Automatisch und Explizit
0 → 65535
In Java gibt es zwei Formen der Typanpasssung (typecast/cast):
Automatische (implizite) Typanpassung und explizite Typanpassung.
char
1
2
3
4
5
6
7
8
9
10
11
12
byte
short
int
long
float
double
−128 → 127
−32768 → 32767
ca. ±2 · 109
ca. ±9 · 1018
ca. ±3.4 · 1038
ca. ±1.8 · 10308
byte b = ( byte ) 0 ;
short s = ( short ) 1;
int i = 2;
l o n g e l l = 3L ;
float f = 4f ;
d ou bl e d = 5 . 0 ;
s = s + b;
i = i + d;
i = 3L ;
ell = ell + f ;
d = ell + f ;
f = 1.0;
CoMa-Übung V (TU Berlin)
Automatische Typanpassung
Wird vom Kompiler bei arithmetischen Operationen mit
unterschiedlichen Datentypen durchgeführt.
s + b wird zu int > short: Fehler!
Kein menschliches Eingreifen nötig.
i + d wird zu double > int: Fehler!
Normalerweise verlustfrei (aber Gleitkommazahlen können ungenauer
als Ganzzahlen sein).
3L ist ein long > int: Fehler!
ell + f wird zu float > long: Fehler!
ell + f wird zu float < double: okay
Achtung:
1.0 ist ein double > float: Fehler!
Beim Rechnen werden byte und short automatisch zu int.
Daher: Aufpassen, dass der Typ der linken
Seite wirklich zur rechten Seite passt.
Es kann nichts automatisch in char umgewandelt werden, da char
keine negativen Zahlen unterstützt.
Schleifeninvarianten, Zahlendarstellung und Typanpassungen
14.11.2012
23 / 32
CoMa-Übung V (TU Berlin)
Schleifeninvarianten, Zahlendarstellung und Typanpassungen
14.11.2012
24 / 32
Typanpassung – Automatisch und Explizit (2)
Explizite Typanpassung
Soll aus einem Datentyp mit größerem Wertebereich einer mit kleinerem
Wertebereich werden, ist ein explizite Typanpassung erforderlich.
Größere Ganzzahl → Kleinere Ganzzahl
Das Vorzeichen und die höchsten Bits werden einfach abgeschnitten.
Explizit Typanpassung
Gleitkommazahl → Ganzzahl
Muss explizit vom Menschen in den Code geschrieben werden.
Die Gleitkommazahl wird zu 0 hin gerundet.
Die Syntax dafür ist (typ) vor den Ausdruck zu schreiben, der
umgewandelt werden soll: int i = (int) 5.4;
56.8 wird zu 56, -42.9 zu -42, etc.
Wird z.B. für die Zuweisung von größeren auf kleinere Datentypen
benutzt.
Ist die Gleitkommazahl außerhalb des Wertebereichs der Ganzzahl, ist
das Ergenis die größte (bzw. kleinste) Ganzzahl des Typs.
Gefahr von Verlust bei der Typanpassung.
(long) -1e40 ist also −263 , die kleinste Zahl, die long darstellen
kann.
Der (typ)-Operator
Hinweis
wird von Java als Operator mit einem Argument betrachtet.
Es ist nicht möglich aus nicht-Zahl-Typen, wie etwa String, durch
automatische oder explizite Typanpassung Zahlen zu machen. Dafür
müssen gesonderte Methoden zum Einsatz kommen.
hat eine höhrere Priorität als alle arithmetischen Operationen!
(int) 1 + 1.0 ist somit ein double.
CoMa-Übung V (TU Berlin)
Schleifeninvarianten, Zahlendarstellung und Typanpassungen
14.11.2012
25 / 32
CoMa-Übung V (TU Berlin)
Schleifeninvarianten, Zahlendarstellung und Typanpassungen
Explizite Typanpassung (2)
Operatoren
Ganzzahl → Gleitkommazahl
Inkrement und Dekrement
Größerer Wertebereich, Kommazahlen statt Ganzzahlen... alles okay?
int und float haben beide 32 Bit Speicher zur Verfügung
long und double haben beide 64 Bit Speicher zur Verfügung
int und long stellen
232
bzw.
264
14.11.2012
26 / 32
Java bietet zwei Operatoren, um Zahlen um eins zu vergrößern / -kleinern:
b = ++a * 2; steht für a = a + 1; b = a * 2;
b = a++ * 2; steht für b = a * 2; a = a + 1;
verschiedene Zahlen da
b = --a * 2; steht für a = a - 1; b = a * 2;
float und double können wegen ihres begrenzten Speichers nicht
mehr als 232 bzw. 264 verschiedene Zahlen darstellen
⇒ es muss Ganzzahlen geben, die nicht verlustfrei von int → float
bzw. long → double übertragen werden können
b = a-- * 2; steht für b = a * 2; a = a - 1;
Zuweisungen mit Operationen
a += b; ist eine Kurzformen für a = (Typ von a) (a + b);
Damit ist folgendes völlig okay:
Hinweis
1
Nur bei sehr großen Zahlen problematisch
2
java.math.BigInteger und java.lang.BigDecimal zum Rechnen
mit höherer Genauigkeit
CoMa-Übung V (TU Berlin)
Schleifeninvarianten, Zahlendarstellung und Typanpassungen
14.11.2012
27 / 32
int i = 2;
i += 0 . 5 ;
Analog dazu funktionieren -=, *= und /=.
CoMa-Übung V (TU Berlin)
Schleifeninvarianten, Zahlendarstellung und Typanpassungen
14.11.2012
28 / 32
Operatorenvorrang
Operatoren
++,--,+,-,!,(Typ)
*,/,%
+,<,>,<=,>=
==,!=
&
^
|
&&
||
?:
=
+=,-=,*=,/=
CoMa-Übung V (TU Berlin)
Gültigkeit von Variablen
Beschreibung
Inkrement, Dekrement, Unäres Plus, unäres
Minus, logisches Nicht, Typanpassung
Multiplikation, Division, Rest
Addition, Subtraktion, Konkatenation von
Strings
Numerische Vergleiche
Gleichheit
Logisches Und
Logisches Xor
Logisches Oder
Logisches konditionales Und
Logisches konditionales Oder
Bedingungsoperator
Zuweisung
Zuweisung mit Operation
Schleifeninvarianten, Zahlendarstellung und Typanpassungen
14.11.2012
29 / 32
Arten der Variablen-Deklaration
Variablen können in Java an drei Stellen deklariert werden:
Als Attribut einer Klasse,
als Parameter einer Methode,
oder als lokale Variable in einer Methode.
1
p u b l i c c l a s s Scope {
2
p r i v a t e S t r i n g name ; // A t t r i b u t
3
4
p u b l i c v o i d t e s t ( i n t a ) { // Methoden−P a r a m e t e r
i n t b = 0 ; // l o k a l e V a r i a b l e
f o r ( i n t i = 0 ; i < 1 0 ; i ++) { // l o k a l e V a r i a b l e
i n t c = 0 ; // l o k a l e V a r i a b l e
}
}
5
6
7
8
9
10
11
}
CoMa-Übung V (TU Berlin)
Schleifeninvarianten, Zahlendarstellung und Typanpassungen
Gültigkeit von Variablen (2)
Gültigkeit von Variablen (3)
Gültigkeit
Eindeutigkeit von Variablennamen
Attribute in der ganzen Klasse gültig.
Einzige Ausnahme: Parameter / lokale Variablen dürfen denselben
Namen wie ein Attribut haben.
Lokale Variablen sind in dem Block ({..}) gültig, in dem sie
deklariert wurden (und nirgendwo außerhalb).
2
3
4
5
6
7
8
9
10
Java geht dann zunächst davon aus, dass der Parameter bzw. die
lokale Variable gemeint ist.
p u b l i c c l a s s Scope {
public void t e s t ( i n t a ) {
int b = 0;
f o r ( i n t i = 0 ; i < 1 0 ; i ++) {
int c = 0;
System . o u t . p r i n t l n ( b + c ) ; // okay
}
System . o u t . p r i n t l n ( c ) ; // F e h l e r
}
}
CoMa-Übung V (TU Berlin)
Schleifeninvarianten, Zahlendarstellung und Typanpassungen
30 / 32
An keiner Stelle des Codes dürfen zwei Variablen mit gleichem Namen
gültig sein.
Parameter einer Methode sind in der ganzen Methode gültig (und
nirgendwo sonst in der Klasse).
1
14.11.2012
→ Fehlergefahr, nach Möglichkeit vermeiden.
1
2
3
4
5
6
14.11.2012
31 / 32
p u b l i c c l a s s Scope {
String a ;
p u b l i c v o i d t e s t ( i n t a , i n t b ) { // okay
i n t b = 0 ; // F e h l e r
}
}
CoMa-Übung V (TU Berlin)
Schleifeninvarianten, Zahlendarstellung und Typanpassungen
14.11.2012
32 / 32
Herunterladen