+ 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)