+ und - als unärer Operator
Transcription
+ und - als unärer Operator
Grundlagen der Informatik Ergänzungen WS 2007/2008 Prof. Dr. Rainer Lütticke 1 Links Stellenwertsysteme mit Links zu Zahlensysteme: http://de.wikipedia.org/wiki/Stellenwertsystem ASCII-Code: http://de.wikipedia.org/wiki/Ascii http://www.free-solutions.de/js/zeichensatz_ascii-dos_code.html http://www.torsten-horn.de/techdocs/ascii.htm http://code-knacker.de/ascii.htm Unicode: http://de.wikipedia.org/wiki/Unicode http://www.unicode.orghttp://de.wikipedia.org/wiki/Stellenwertsystem http://de.selfhtml.org/inter/unicode.htm http://unicode.e-workers.de/ Erweiterte ASCII-Tabelle (ISO-8859-Familie Quelle: http://www.code-knacker.de/ascii.htm Online-Java Bücher Java ist auch eine Insel: http://www.galileocomputing.de/openbook/javainsel6/ Java in 21 Tagen: http://jerry.c-lab.de/java/21Tage/ Zuweisungen Achtung: int j = 012; // in Java: Oktal 012 ist dezimal 10 Wissenschaftliche Darstellung von Gleitkommazahlen: double x = 3.0e+3 // bedeutet x = 3000.0 Unärer Operator: byte b = 0; b = -b; // "Cannot convert from int to byte" b = +b; // "Cannot convert from int to byte" Der Compiler meldet einen Fehler, da der Ausdruck auf der rechten Seite durch einen unären Operator in einen Integer umgewandelt wird. Dies gilt immer für die Typen byte, short und char. Operator 1 Implizite Typumwandlung bei kleinen ganzzahligen Datentypen short s1 = 1, s2 = 2; // short s3 = s1 + s2; // Compilerfehler! short s3 = (short)( s1 + s2 ); // das ist in Ordnung Es ist nicht möglich, ohne explizite Typumwandlung zwei short- oder byte-Zahlen zu addieren. Das Verhalten des Übersetzers lässt sich mit der automatischen Anpassung erklären. Wenn Ganzzahl-Ausdrücke vom Typ kleiner int mit einem Operator verbunden werden, passt der Compiler eigenmächtig den Typ auf int an. Bei der Zuweisung wird dies zum Problem. Denn dann steht auf der rechten Seite ein int und auf der linken Seite der kleinere Typ byte oder short. Dies merkt der Compiler an, da Zahlen abgeschnitten werden könnten. Bei den Typen long, int, double und float hat ein Operator in dieser Weise keinen Einfluss. Operatoren 2 Unterschied = und == : int a; a = 5; // Anweisung mit Zuweisung System.out.println( a = 5 ); // Ausdruck mit Zuweisung. Liefert 5 System.out.println( a == 5 ); // Ausdruck mit Vergleich. Liefert true Typanpassung bei Zuweisungsoperator: int i = 5; i += 25.4; // liefert i = 30, d.h implizite Typanpassung findet statt: i = (int)(i + 25.4) Operatoren 3 Inkrement oder Dekrement mit Fließkommazahlen: double e = 5.2; System.out.println( --e ); // liefert 4.2 Kuriose Zuweisung: a = 2; a = ++a; // a = 3 b = 2; b = b++; // b = 2 EXOR-Operator ^ (oft auch nur XOR-Operator genannt): (!a && b) || (a && !b) entspricht a ^ b Unterschied zwischen && und &: boolean a = false && meineMethode(); // meineMethode() wird nicht aufgerufen boolean b = false & meineMethode(); // meineMethode() wird aufgerufen Operator 4 Operatorprioritäten: Rang 1: ++, --, +, – (+ und - als unärer Operator), !, (Typ) (bedeutet Typcasting) Rang 2: *, /, % Rang 3: +, - (Addition, Subtraktion von Zahlenwerten), + (Stringkonkatenation) Rang 4: >>, <<, >>> (Verschiebung) Rang 5: <, <=, >, >=, instanceof Rang 6: ==, != Rang 7: & Rang 8: ^ Rang 9: | Rang 10: && Rang 11: || Rang 12: ?: (Bedingungsoperator) Rang 13: = Rang 14: *=, /=, %=, +=, -= usw. (Zuweisung mit Operation) Bedingungen Achtung: falsches Semikolon int i = 1; if ( i < 0 ) ; System.out.println( "Ist das wirklich wahr?" ); if ( i > 1000 ) ; System.out.println( "Ist das wirklich wahr?" ); Schleifen Achtung:Abbruchbedingung für Gleitkommazahlen double d = 0.0; while ( d != 1.0 ) { d += 0.1; System.out.println( d ); } Liefert: 0.1 0.2 0.30000000000000004 0.4 0.5 0.6 0.7 0.7999999999999999 0.8999999999999999 0.9999999999999999 1.0999999999999999 1.2 1.3 Bei Gleitkommawerten sollte man mit relationalen Operatoren <= oder >= arbeiten. Schleifen Wann for und wann while? for-Schleifen sollten immer dann benutzt werden, wenn eine Variable um eine konstante Größe erhöht wird. Beispiel: for (int i=1; i<10; i++) Tritt in der Schleife keine Schleifenvariable auf, die inkrementiert oder dekrementiert wird, sollte eine while-Schleife genutzt werden. Beispiel: while (b == true) ....... Eine do-while-Schleife sollte dann ihren Einsatz finden, wenn die Abbruchbedingung erst am Ende eines Schleifendurchlaufs ausgewertet werden kann. Auch sollte die for-Schleife dort eingesetzt werden, wo sich alle drei Ausdrücke im Schleifenkopf auf dieselbe Variable beziehen. Vermieden werden sollten unzusammenhängende Ausdrücke im Schleifenkopf. Methoden - Signum Signum: Um für das Vorzeichen einen Wert zu bekommen, lässt sich die Methode signum() verwenden. Sie liefert +1 für positive oder –1 für negative Zahlen und 0 für 0: · java.lang.Integer.signum( int i ) · java.lang.Long.signum( long i ) · java.lang.Math.signum( double d ) · java.lang.Math.signum( float f ) Methoden - Runden Es gibt mehrere Methoden zum Runden: ceil(), floor() und rint() haben als Eingabe- und Ausgabetyp double. round() hat bei dem Eingabetyp double den Ausgabetyp long, beim Eingabetyp float den Ausgabetyp int. ceil() rundet zum nächst größeren ganzzahligen Wert. floor() rundet zum nächst kleineren Wert. rint() rundet zum nächsten Wert. Aber Achtung, im negativen Bereich wird ein –x.5 zum kleineren Wert –(x+1).0 gerundet. round() rundet im negativen Bereich zum größeren Wert: –x.5 wird zu –x . Beispiele: Math.ceil(3.5) liefert 4.0, Math.ceil(3.2) liefert 4.0, Math.ceil(-1.5) liefert -1.0 Math.floor(3.5) liefert 3.0, Math.floor(3.2) liefert 3.0, Math.floor(-1.5) liefert -2.0 Math.rint(3.5) liefert 4.0, Math.rint(3.2) liefert 3.0, Math.rint(-1.5) liefert -2.0 Math.round(3.5) liefert 4, Math.round(3.2) liefert 3, Math.round(-1.5) liefert -1 Überladen von Methoden Nicht erlaubt: Namen der Paramter sind unterschiedlich, Anzahl der Parameter ist gleich, Typen der Parameter sind gleich Beispiel: int methode1(int v1, int v2) int methode1(int p1, int p2) Rückgabewert ist unterschiedlich, Anzahl der Parameter ist gleich, Typen der Parameter sind gleich Beispiel: int methode2(int v1, int v2) void methode1(int v1, int v2) Erlaubt: Beispiele: int methode3(int v1, int v2) int methode4(int v1, int v2) int methode3(int v1, double v2) int methode4(int v1, int v2, int v3)