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