Ausdrücke:Javakurs: Unterschied zwischen den Versionen
(13 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt) | |||
Zeile 23: | Zeile 23: | ||
| ! again | | ! again | ||
|} | |} | ||
==== Inkrement, Decrement ==== | |||
Einen Sonderfall bilden die 4 Operatoren Post-Increment, Pre-Increment, Post-Decrement und Pre-Decrement. | |||
Sie können nur auf Variablen angewendet werden, nicht auf Konstanten oder andere Ausdrücke. | |||
Die 2 Post-Operatoren verändern den Wert der Variablen nach der Auswertung, die Pre-Operatoren vorher. | |||
Beispiel: | |||
<pre>int a = 5; | |||
int b = a++; | |||
System.println(String.format("a = 5; 2 * a++ = %d", 2 * a++)); | |||
System.println(String.format("a: %d", a)); | |||
a = 5; | |||
System.println(String.format("a = 5; 2 * --a = %d", 2 * --a)); | |||
System.println(String.format("a: %d", a)); | |||
</pre> | |||
Ausgabe: | |||
<pre>a = 5; 2 * a++ = 10 | |||
a: 6 | |||
a = 5; 2 * --a = 8 | |||
a: 4 | |||
</pre> | |||
=== 2-stellige Operatoren === | === 2-stellige Operatoren === | ||
Zeile 36: | Zeile 59: | ||
| '==' '!=' | | '==' '!=' | ||
| Vergleich: gleich, ungleich | | Vergleich: gleich, ungleich | ||
| n == 0 && m != 3 | | n == 0 && m != 3 boolean equal = radius1 == radius2; | ||
|- | |- | ||
| <nowiki>'<' '>' '<=' '>='</nowiki> | | <nowiki>'<' '>' '<=' '>='</nowiki> | ||
Zeile 49: | Zeile 72: | ||
| Bit-Manipulation | | Bit-Manipulation | ||
| a | (b & (c ^ 0xff)) | | a | (b & (c ^ 0xff)) | ||
|- | |||
| '=' '+=' '-=' '/=' '*=' '%=' | |||
| Zuweisung | |||
| a = (b = 5) + 1; a += 5; | |||
|} | |} | ||
<b>Beachte</b>: | <b>Beachte</b>: | ||
Zeile 57: | Zeile 84: | ||
<pre><nowiki><condition> '?' <true-expression> ':' <false-expression></nowiki> | <pre><nowiki><condition> '?' <true-expression> ':' <false-expression></nowiki> | ||
</pre> | </pre> | ||
Es wird die Bedingung | Es wird die Bedingung ausgewertet. Liefert diese den Wert true, ist das Ergebnis der erste Ausdruck, | ||
sonst der zweite. | sonst der zweite. | ||
Zeile 63: | Zeile 90: | ||
<pre> | <pre> | ||
column % 2 == 0 ? "blue" : "red"; | column % 2 == 0 ? "blue" : "red"; | ||
</pre> | |||
== Der '+'-Operator für Strings == | |||
Der Datentyp String kennt genau einen Operator, das '+'. | |||
Damit können Strings oder auch char-Ausdrücke zusammengesetzt werden. | |||
=== Beispiel === | |||
<pre> | |||
String s = "Hello"; | |||
char separator = ' '; | |||
s = s + separator + "world"; | |||
</pre> | |||
== Automatische Typanpassung in Ausdrücken == | |||
Werden verschieden Datentypen mit einem Operator verknüft, passieren automatische Anpassungen. | |||
* Der "eingeschränktere" Operand wird in den umfassenderen Typ gewandelt. | |||
* Reihenfolge der Typen: int long float double | |||
* Da die Zuweisung auch ein Operator ist, gilt das auch für Zuweisungen: Wird an eine double-Variable ein int-Wert zugewiesen, wird automatisch konvertiert. | |||
Beispiele: | |||
* Ist ein Operand ein int, der andere ein float, wird der int-Operand automatisch in float gewandelt und die Operation findet mit 2 float statt. | |||
<pre>int a = 1; | |||
float f = a / 2; | |||
System.out.println(String.format("1/2 = %.3f", f)); | |||
System.out.println(String.format("1/2.0 = %.3f", a / 2.0)); | |||
</pre> | |||
Ausgabe: | |||
<pre>1/2 = 0.000 | |||
1/2.0 = 0.500 | |||
</pre> | |||
== Explizite Typwandlung (Cast) == | |||
Soll ein Datentyp in einen anderen konvertiert werden, geschiet dies mit dem Cast-Operator: | |||
=== Syntax === | |||
<pre><nowiki> | |||
'(' <data-type>')' <expr> | |||
</nowiki></pre> | |||
=== Beispiel === | |||
<pre> | |||
double x = (double) 25; | |||
x = (double) 5 / 3; | |||
</pre> | |||
Hinweis: Der Cast-Operator bindet stärker als das '/', dies entspricht also dem Ausdruck | |||
<pre>x = ((double) 5) / 3; | |||
</pre> | |||
== Vorrangregeln (Prefärenzen) == | |||
Für jeden Operator gibt es einen Vorrang-Grad. | |||
Haben 2 Operatoren verschiedene Vorrang-Grade, wird zuerst die Operation mit dem höheren Grad ausgeführt. | |||
Mit Klammern kann man die Vorrangregeln umgehen. | |||
Die Kurzfassung: | |||
* Für die arithmethischen Operatoren gilt die Rangfolge wie in der Mathematik: Punkt vor Strich. | |||
* Arithmethik bindet stärker als Vergleiche | |||
* Boolsche Operatoren binden schwächer als Vergleiche. '&&' bindet stärker als '||'. | |||
* Die Zuweisung bindet schwächer als alle anderen Operatoren. | |||
Ausführlich: [http://introcs.cs.princeton.edu/java/11precedence/ Operator-Präferenzen] | |||
=== Beispiel === | |||
<pre>int x = ...; | |||
boolean a = 0 >= x && x < 10 || x >= 20 && x < 30; | |||
</pre> | |||
ist äquivalent zu: | |||
<pre>int a = ( ( (0 >= x) && (x < 10) ) || ( (x >= 20) && (x < 30) ) ); | |||
</pre> | |||
== Aufgaben == | |||
* Gegeben: Dauer in Sekunden: duration gesucht: Stunden hour, Minuten min, Sekunden sec | |||
<pre>int duration = 123483; | |||
int hour = ...; | |||
int min = ....; | |||
int sec = ....; | |||
</pre> | |||
* Gegeben: x Gesucht: liegt x im Intervall [1991, 2009] | |||
<pre>int x = 1991; | |||
boolean inMarcsYouth = ...; | |||
</pre> | |||
* Gegeben: eine Zahl x. Gesucht: 0 wenn x gleich 0, -1 wenn x negativ, +1 wenn x positiv | |||
<pre>int x = 1; // oder -2 oder 0 oder 5 | |||
int sign = ...; | |||
</pre> | </pre> |
Aktuelle Version vom 16. Oktober 2015, 20:51 Uhr
Theorie[Bearbeiten]
Ein Ausdruck ist eine Verknüpfung von Operanden mittels Operatoren.
Es gibt 1-, 2- und 3-stellige Operatoren.
1-stellige Operatoren[Bearbeiten]
Operator | Bemerkung | Beispiele |
'-' | negiert einen artithmetischen Ausdruck | - (a + b) |
'!' | negiert einen boolschen Ausdruck | ! again |
Inkrement, Decrement[Bearbeiten]
Einen Sonderfall bilden die 4 Operatoren Post-Increment, Pre-Increment, Post-Decrement und Pre-Decrement. Sie können nur auf Variablen angewendet werden, nicht auf Konstanten oder andere Ausdrücke.
Die 2 Post-Operatoren verändern den Wert der Variablen nach der Auswertung, die Pre-Operatoren vorher.
Beispiel:
int a = 5; int b = a++; System.println(String.format("a = 5; 2 * a++ = %d", 2 * a++)); System.println(String.format("a: %d", a)); a = 5; System.println(String.format("a = 5; 2 * --a = %d", 2 * --a)); System.println(String.format("a: %d", a));
Ausgabe:
a = 5; 2 * a++ = 10 a: 6 a = 5; 2 * --a = 8 a: 4
2-stellige Operatoren[Bearbeiten]
Operatoren | Bemerkung | Beispiele |
'+' '-' '*' '/' '%' | Arithmetik: addieren, subtrahieren, multiplizieren, dividieren, modulo | a + b*c - (d % 2) |
'==' '!=' | Vergleich: gleich, ungleich | n == 0 && m != 3 boolean equal = radius1 == radius2; |
'<' '>' '<=' '>=' | Vergleich mit Sortierung: kleiner, größer, kleiner gleich, größer gleich | n >= 0 && n < max |
'||' '&&' | boolsche Arithmetik | a || b && c |
'|' '&' '^' | Bit-Manipulation | (b & (c ^ 0xff)) |
'=' '+=' '-=' '/=' '*=' '%=' | Zuweisung | a = (b = 5) + 1; a += 5; |
Beachte: Der Operator "gleich" ist '==' (2 mal '='), nicht mit der Zuweisung '=' verwechseln!
3-stelliger Operator[Bearbeiten]
Es gibt genau einen 3-stelligen Operator, den bedingten Ausdruck:
<condition> '?' <true-expression> ':' <false-expression>
Es wird die Bedingung ausgewertet. Liefert diese den Wert true, ist das Ergebnis der erste Ausdruck, sonst der zweite.
Beispiel:
column % 2 == 0 ? "blue" : "red";
Der '+'-Operator für Strings[Bearbeiten]
Der Datentyp String kennt genau einen Operator, das '+'. Damit können Strings oder auch char-Ausdrücke zusammengesetzt werden.
Beispiel[Bearbeiten]
String s = "Hello"; char separator = ' '; s = s + separator + "world";
Automatische Typanpassung in Ausdrücken[Bearbeiten]
Werden verschieden Datentypen mit einem Operator verknüft, passieren automatische Anpassungen.
- Der "eingeschränktere" Operand wird in den umfassenderen Typ gewandelt.
- Reihenfolge der Typen: int long float double
- Da die Zuweisung auch ein Operator ist, gilt das auch für Zuweisungen: Wird an eine double-Variable ein int-Wert zugewiesen, wird automatisch konvertiert.
Beispiele:
- Ist ein Operand ein int, der andere ein float, wird der int-Operand automatisch in float gewandelt und die Operation findet mit 2 float statt.
int a = 1; float f = a / 2; System.out.println(String.format("1/2 = %.3f", f)); System.out.println(String.format("1/2.0 = %.3f", a / 2.0));
Ausgabe:
1/2 = 0.000 1/2.0 = 0.500
Explizite Typwandlung (Cast)[Bearbeiten]
Soll ein Datentyp in einen anderen konvertiert werden, geschiet dies mit dem Cast-Operator:
Syntax[Bearbeiten]
'(' <data-type>')' <expr>
Beispiel[Bearbeiten]
double x = (double) 25; x = (double) 5 / 3;
Hinweis: Der Cast-Operator bindet stärker als das '/', dies entspricht also dem Ausdruck
x = ((double) 5) / 3;
Vorrangregeln (Prefärenzen)[Bearbeiten]
Für jeden Operator gibt es einen Vorrang-Grad. Haben 2 Operatoren verschiedene Vorrang-Grade, wird zuerst die Operation mit dem höheren Grad ausgeführt. Mit Klammern kann man die Vorrangregeln umgehen.
Die Kurzfassung:
- Für die arithmethischen Operatoren gilt die Rangfolge wie in der Mathematik: Punkt vor Strich.
- Arithmethik bindet stärker als Vergleiche
- Boolsche Operatoren binden schwächer als Vergleiche. '&&' bindet stärker als '||'.
- Die Zuweisung bindet schwächer als alle anderen Operatoren.
Ausführlich: Operator-Präferenzen
Beispiel[Bearbeiten]
int x = ...; boolean a = 0 >= x && x < 10 || x >= 20 && x < 30;
ist äquivalent zu:
int a = ( ( (0 >= x) && (x < 10) ) || ( (x >= 20) && (x < 30) ) );
Aufgaben[Bearbeiten]
- Gegeben: Dauer in Sekunden: duration gesucht: Stunden hour, Minuten min, Sekunden sec
int duration = 123483; int hour = ...; int min = ....; int sec = ....;
- Gegeben: x Gesucht: liegt x im Intervall [1991, 2009]
int x = 1991; boolean inMarcsYouth = ...;
- Gegeben: eine Zahl x. Gesucht: 0 wenn x gleich 0, -1 wenn x negativ, +1 wenn x positiv
int x = 1; // oder -2 oder 0 oder 5 int sign = ...;