Ausdrücke:Javakurs: Unterschied zwischen den Versionen

Aus Info-Theke
Zur Navigation springen Zur Suche springen
 
(11 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 61: Zeile 84:
<pre><nowiki><condition> '?' <true-expression> ':' <false-expression></nowiki>
<pre><nowiki><condition> '?' <true-expression> ':' <false-expression></nowiki>
</pre>
</pre>
Es wird die Bedingung ausgeführt. Liefert diese den Wert true, ist das Ergebnis der erste Ausdruck,
Es wird die Bedingung ausgewertet. Liefert diese den Wert true, ist das Ergebnis der erste Ausdruck,
sonst der zweite.
sonst der zweite.


Zeile 67: 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>
</pre>


Zeile 77: Zeile 165:
</pre>
</pre>
* Gegeben: x Gesucht: liegt x im Intervall [1991, 2009]
* Gegeben: x Gesucht: liegt x im Intervall [1991, 2009]
<pre>int x = ...;
<pre>int x = 1991;
bool inMarcsYouth = ...;
boolean inMarcsYouth = ...;
</pre>
</pre>
* Gegeben: eine Zahl x. Gesucht: 0 wenn x gleich 0, -1 wenn x negativ, +1 wenn x positiv
* Gegeben: eine Zahl x. Gesucht: 0 wenn x gleich 0, -1 wenn x negativ, +1 wenn x positiv
<pre>int x = ...;
<pre>int x = 1; // oder -2 oder 0 oder 5
int sign = ...;
int sign = ...;
</pre>
</pre>

Aktuelle Version vom 16. Oktober 2015, 20:51 Uhr


Übersicht

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 = ...;