Wirtschaftsinformatik (Bachelor-Studiengang): Programmierung (1. Semester)
Sie sind hier: Startseite › Wirtschaftsinformatik › Programmierung Java (Kurs 1): Anweisungen
HB / CM, Kurs vom 01.04.2002 - 30.09.2002
Wertzuweisungsanweisungen
Eine Wertzuweisungsanweisung muss folgende Gestalt haben:
Beispiel: Wird durch Semikolon zur Anweisung!
Wertzuweisung;
Eine einfache Wertzuweisung muss folgende Gestalt haben:
- lokale Variable = Zuweisungsausdruck
- Attribut = Zuweisungsausdruck
Bei komplexen Wertzuweisungen kann
- ... auf der linken Seite eine Array-Komponente oder ein Attribut einer anderen Klasse stehen.
- ... ein anderer der zwölf möglichen Zuweisungsoperatoren stehen.
Programmierregel: Links und rechts des Zuweisungsoperators mindestens ein Leerzeichen!
Bei einer Wertzuweisung wird
- der Wert des Zuweisungsausdrucks ermittelt
- der so ermittelte / dieser als neuer Wert der linken Seite gespeichert.
Der Zuweisungsausdruck auf der "rechten" Seite muss zuweisungskompatibel zur "linken" Seite sein. Datentypen sind zuweisungskompatibel immer dann, wenn sie identisch sind.
Für die primitiven Datentypen ist außerdem zulässig (19 Fälle):
- "links":
short
int
long
float
double - "rechts":
byte
byte, short, char
byte, short, char, int
byte, short, char, int, long
byte, short, char, int, long, float
Falls auf der rechten Seite eine Konstante oder ein konstanter Ausdruck steht, ist folgendes ferner zulässig:
- "links":
byte
short - "rechts":
short, char, int
char, int
Dies aber nur, wenn der (Konstante-)Wert der rechten Seite zum Wertebereich der linken Seite gehört.
Wenn die Werte nicht zuweisungskompatibel sind, wird das Programm nicht ausgeführt (Sicherheitsaspekt).
Der Zuweisungsausdruck auf der rechten Seite kann von
- einfacher Gestalt sein (Konstante, Konstantenausdruck)
- komplexer Gestalt sein, d.h. sich aus mehreren komplexen Operationen zusammensetzen.
Welche Operatoren gibt es für die primitiven Datentypen?
Für die ganzzahligen Datentypen:- die unären Vorzeichenoperatoren
+
und−
- die binären additiven Operatoren
+
und−
- die binären multiplikativen Operatoren
×
: ganzzahlige Multiplikation
÷
: ganzzahlige Division
%
: ganzzahliger Rest bei der ganzzahligen DivisionAchtung: Bei den Operatoren
Es gilt immer die folgende Regel:÷
oder%
muss der rechte Operand immer ≠ 0 sein!
(n ÷ m) × + (n % m) = n
- unäre Präfix-Inkrement-Operator
++
- Der Operand muss Variable, Attribut oder
Array-Komponente sein, keine
Konstante oder "Zahl" z.B.
++7
. - Der Wert des Operanden wird um eins erhöht.
- Der Wert der Operation, d.h. das Ergebnis, ist identisch mit dem um eins erhöhten Wert ds Operanden.
- Der Operand muss Variable, Attribut oder
Array-Komponente sein, keine
Konstante oder "Zahl" z.B.
- unäre Postfix-Inkrement-Operator
++
- Der Operand muss Variable, Attribut oder
Array-Komponente sein, keine
Konstante oder "Zahl" z.B.
++7
. - Der Wert des Operanden wird um eins erhöht.
- Der Wert der Operation ist identisch mit dem der ursprünglichen Operation.
... int n = 10;
System.out.println(++n + " " + n++ + " " + n)
Ausgabe: 11 __ 11 __ 12 - Der Operand muss Variable, Attribut oder
Array-Komponente sein, keine
Konstante oder "Zahl" z.B.
- unäre Präfix-Dekrement-Operator
Beispiel:−−n
Funktionsweise analog 4. - unäre Postfix-Dekrement-Operator
Beispiel:n−−
Funktionsweise analog 5. - Die Vergleichsoperatoren
==; !=; <; <=; >; >=;
liefern immer ein Ergebnis vom Datentypboolean
, d.h.true
/false
Beispiel:7 = 10 (= false)
Für alle Inkrement- oder Dekrement-Operatoren gilt:
- Der Datentyp des Ergebnisses ist identisch mit dem Datentyp des Ergebnisses.
- Sie können nicht auf als
final
deklarierte Datentypen angewendet werden.
- Wenn das Ergebnis der Operation zum Wertebereich des Datentyps der Operation gehört, ist es exakt.
- Falls nicht, kommt es nicht zu einem Fehler, das Ergebnis ist aber falsch.
Beispiel: Ausgabe ist −−129 496 7296
int a = 10.000.000.000;
int b = 3 × a;
System.out.print(b);
Hinweis: Die Datentypen müssen so gewählt werden, dass auch das Ergebnis sämtlicher beabsichtigten Operationen auch zum Wertebereich gehört!
Mit Hilfe des unären cast
-Operators kann der Datentyp des
Operanden (zwischenzeitlich) verändert werden.
(Zieldatentyp) Operator
Hinweis: Bei unvorsichtigem Gebrauch kann es zu Verlust von Informationen kommen!
Beispiel: Java-Notationen
int x = 100;
byte y = x; // Fehler, weil auf rechter Seite keine Konstante
System.out.print(y);
int x =100;
byte y = (byte) x;
System.out.print(y); // 100
int x = 1000;
byte y = (byte) x; // Okay, aber ...
System.out.print(y); // -24
int x = 65;
char zeichen = (char) x;
System.out.print(zeichen); // A
Die Shift
-Operatoren:
«
, »
, >»
Die bitweisen Operatoren
~
(bitweises Komplement)&
(bitweises "und")|
(bitweises "oder")^
(bitweises "entweder oder")
(Selbststudium)
Die Operatoren für Gleitkommadatentypen float
und double
- die Vorzeichenoperatoren (
+ -
) - additive Operatoren (
+ -
) - multiplikativen Operatoren (
× ÷ %
) - Inkrement- und Dekrementoperatoren (
++ ++ -- --
) - Vergleichsoperatoren (
== != < <= > >=
) - Cast-Operatoren (
( )
)
Zu beachten ist die Arithmetik für spezielle Werte (+8,
−8, NaN
).
Der Unterschied zwischen strikter und nicht strikter Gleitkommarithmetik » Selbststudium
Für den Datentyp boolean gibt es folgende Operatoren
- Vergleichsoperatoren (
== !=
) - logische Negation (
!
) - logisches "und" (
&&
) - logisches "oder" (
||
) - bitweise Operatoren (
&, ^, |
)
Hinweis: Damit wird in Java die Aussagenlogik realisiert!
Neben dem einfachen Wertzuweisungsoperator =
gibt es in Java
elf zusammengesetzte Wertzuweisungsoperatoren.
+=
−=
*=
/=
%=
«=
»=
>=
&=
|=
^=
Sie funktionieren alle nach demselben Muster:
Beispiel Wertzuweisung:
byte x = 10;
...
x ×= 3;
Ergebnis ist 30!
dasselbe wie
byte x = 10;
...
x = (byte) ((x) × (3));
Ergebnis ist auch hier 30!
Dabei sind die Klammern wichtig:
byte x = 10;
byte y = 2;
...
x *= y + 3;
ist dasselbe wie:
x = (byte) ((x) × (y + 3));
Ergebnis ist 50!
und nicht dasselbe wie
x = (byte) ((x × y) + 3);
Ergebnis ist 23!
Auswahlanweisungen
Die Auswahlanweisungen
if
-Anweisungswitch
-Anweisung
dienen zur Auswahl zwischen Alternativen (2: if
-Anweisung;
mehrere: switch
-Anweisung).
Die if
-Anweisung
... hat folgende Gestalt:
if (Ausdruck)
Anweisung1
else
Anweisung2
Sie funktioniert so:
Zuerst wird der Ausdruck ausgewertet. Er muss einen Wert vom
Datentyp boolean
haben.
Falls true
wird Anweisung 1
ausgeführt, falls false
wird Anweisung 2 ausgeführt.
int a, b, c;
...
if (b != 0)
c = a / b;
else
System.out.print("Fehler Division durch 0!");
Bei Anweisung 1 und bei Anweisung 2 kann es sich um eine einzelne Anweisung handeln oder um einen ganzen Block.
int a, b, c;
...
if (b != 0)
{
c = a / b;
System.out.print(c);
}
else
System.out.print("Fehler Division durch 0!");
Der else
-Teil einer if
-Anweisung kann fehlen.
int a, b, c;
...
if (b != 0)
{
c = a / b;
System.out.print(c);
}
Im if
-Teil und auch im else
-Teil können weitere
if
-Anweisungen auftreten.
int a, b, c;
...
if (a > b)
d = c / a - b;
else
if (a < b)
d = c ÷ (-1 × (a - b));
else
System.out.print("Fehler Division durch 0!");
Die switch
-Anweisung
Quelltext-Beispiel 2 überspringen
Beispielschema: Ist zur Auswahl zwischen mehreren
Alternativen da
switch (Ausdruck)
{
case Fallausdruck_1 :
Anweisungen
case Fallausdruck_2 :
Anweisungen
...
case Fallausdruck_N :
Anweisungen
default: kann fehlen
Anweisungen
}
Wird so ausgeführt:
Zuerst wird Ausdruck ausgewertet. Der Wert des Ausdrucks von
von einem der folgenden Datentypen sein: char, byte, short,
int
, nicht boolean
und nicht long
.
Anschließend wird überprüft, ob der Wert von
Ausdruck, identisch mit einem der Werte von Fallausdruck 1 bis
Fallausdruck N.
Falls ja, werden die Anweisungen dieses Falls ausgeführt und sämtliche folgenden Anweisungen.
Falls nein, werden die hinter default
stehenden Anweisungen ausgeführt
und alle folgenden. Falls es kein default
-Label gibt, wird keine Anweisung
ausgeführt.
Die Fallausdrücke müssen entweder Konstanten oder Konstantenausdrücke sein. Ihre Werte müssen zuweisungskompatibel sein zum Datentyp des Wertes von Ausdruck. Keine zwei Fallausdrücke dürfen denselben Wert haben.
Es darf nur ein oder kein default
-Label vorkommen.
Zum rechtzeitigen Verlassen der switch
-Anweisung ist die
break
-Anweisung
einzusetzen. Sie führt zum sofortigen Verlassen der switch
-Anweisung.
Quelltext-Beispiel 3 überspringen
Beispiel: Hinter case
müssen keine Anweisungen stehen.
int wert;
...
switch (wert)
{
case 0 :
case 4 :
case 6 :
case 8 :
System.out.print("gerade");
break;
case 2 :
System.out.print("gerade und prim");
break;
case 1 :
case 9 :
System.out.print("ungerade");
break;
case 3 :
case 5 :
case 7 :
System.out.print("ungerade und prim");
break;
default:
System.out.print("Gehoert nicht zum Wertebereich");
break;
}
Programmierregel: break
nie zu anderen Zwecken
einsetzen!
Wiederholungsanweisungen
In Java gibt es drei Wiederholungs-Anweisungen:
do-while
-Anweisungwhile
-Anweisungfor
-Anweisung
Die do-while
-Anweisung
... hat folgende Gestalt:
do
Anweisung
while (Ausdruck);
Bei Anweisung kann es sich um genau eine Anweisung handeln oder um einen ganzen Block:
do
{
Anweisung1
...
AnweisungN
} while (Ausdruck);
Auch wenn es nur eine Anweisung ist, ist es üblich, sie als Block zu schreiben.
Der Wert des Ausdrucks muss boolean
sein.
Die do-while
-Anweisung
wird wie folgt ausgeführt:
- Es wird die Anweisung bzw. der Block ausgeführt.
- Danach wird der Ausdruck ausgewertet.
- Ist der Wert von Ausdruck
true
, geht es weiter mit 1. - Ist der Wert von Ausdruck
false
, wird die Ausführung beendet.
Hinweis: Anweisung wird immer mindestens einmal ausgeführt ("fußgesteuerte Schleife")!
Quelltext-Beispiel 4 überspringen
int intEingabe(int min, int max) throws IOException
{
BufferedReader eingabe = new BufferedReader(new InputStreamReader(System.in));
int eingabeZahl;
boolean eingabeOK;
do
{
eingabeZahl = Integer.parseInt(eingabe.readLine());
eingabeOK = (eingabeZahl >= min) && (eingabeZahl <= max);
if (!eingabeOK)
System.out.Print(" geeigneter Hinweis ");
} while (!eingabeOK);
return eingabeZahl;
}
Die while
-Anweisung
... hat folgende Gestalt
while (Ausdruck)
Anweisung
Bei Anweisung kann es sich um nur eine Anweisung handeln oder einen ganzen Block.
while (Ausdruck)
{
Anweisung1
...
AnweisungN
}
Der Wert von Ausdruck muss vom Typ boolean
sein.
Die while
-Anweisung wird wie folgt ausgeführt:
- Zuerst wird Ausdruck ausgewertet.
- Falls der Wert
true
ist, wird Anweisung bzw. der Block ausgeführt. Danach geht es mit 1. weiter. - Falls der Wert
false
ist, wird die Ausführung beendet.
Hinweis: Es kann passieren, dass Anweisung nie ausgeführt wird ("kopfgesteuerte Schleife")!
Quelltext-Beispiel 5 überspringen
Beispiel 1:
void schreibeZeichen(int anzahl, char zeichen)
{
while (anzahl --> 0)
System.out.print(zeichen);
}
Quelltext-Beispiel 6 überspringen
Beispiel 2:
int x = 1;
int summe = 0;
while (x <= 100)
{
summe += x;
x++;
}
System.out.print(summe); // 5050
Die for
-Anweisung
... hat folgende Gestalt:
for (Initialisierungsausdruck; Testausdruck; Inkrementierungsausdruck)
Anweisung
Bei Anweisung handelt es sich um genau eine Anweisung oder um einen Block.
for (...)
{
Anweisung1
...
AnweisungN
}
Der Testausdruck muss einen Wert vom Datentyp boolean
haben,
d.h. true
oder false
.
Die for
-Anweisung wird wie folgt ausgeführt:
- Es wird der Initialisierungsausdruck ausgewertet.
- Es wird der Testausdruck ausgewertet.
- Ist der Wert des Testausdrucks
true
,(3a) dann wird Anweisung ausgeführt. (3b) Danach wird der Inkrementierungsausdruck ausgewertet. Anschließend geht es mit 2. weiter. - Wenn der Wert des Testausdrucks
false
ist, wird die Ausführung derfor
-Anweisung beendet.
Quelltext-Beispiel 7 überspringen
int i;
int summe = 0;
...
for (i = 1; i <= 100; i++)
summe += i;
i = 1 1.
i <= 100 2.
summe += i 3a
i++ 3b
Beim Initialisierungsausdruck kann es sich auch um eine Liste, von durch Kommata getrennten, Ausdrücken handeln, die von links nach rechts ausgewertet werden.
int i, summe;
...
for (i = 1, summe = 0; i <= 100, i++)
summe += i;
Dasselbe gilt für den Inkrementierungsausdruck.
int i, summe;
...
for (i = 1, summe = 0; i <= 100; summe += i, i++)
;
Eine nützliche Besonderheit von Java (und C++, nicht C) besteht darin, dass der Initialisierungsausdruck aus einer Variablendeklaration mit Initialisierung bestehen kann.
Quelltext-Beispiel 8 überspringen
int summe = 0;
for (int i = 1; i <= 100; i++)
summe += I;
for (int i = 5; i > 0; i--)
System.out.print("\n");
int i = 1
kann sofort genutzt werden, aber nur innerhalb der
for
-Anweisung.
Hinweis: Im Initialisierungsausdruck können sogar mehrere Variablen gleichen Datentyps deklariert und initialisiert werden, nicht verschiedener Datentypen!
for (int i = 1, summe = 0; i <= 100; summe += i, i++)
System.out.println(summe);
Das Fehlen des Initialisierungsausdrucks
bzw.
Inkrementierungsausdrucks kann durch Operationen
&außerhalb& der for
-Anweisung
bzw. geeignete
Operatoren ausgeglichen werden.
int i = 1, summe = 0;
for ( ; i <= 100; )
summe += i++;
Das Fehlen des Testausdrucks bedeutet Endlosschleifen.
for ( ; ; )
System.out.print(".");
Die return
-Anweisung
... hat folgende Gestalt:
return Ausdruck;
";" muss sein, "Ausdruck" kann fehlen.
Sie wird wie folgt ausgeführt:
- Zuerst wird Ausdruck ausgewertet. Das Ergebnis muss einen Datentyp haben, der zuweisungskompatibel ist zum Datentyp des Rückgabewertes der Methode.
- Anschließend wird die Ausführung der Methode unmittelbar abgebrochen und der Wert von Ausdruck dem Aufrufer der Methode als Rückgabewert übergeben.
Methoden, die keinen Rückgabewert liefern (d.h. als void
deklariert wurden), brauchen
keine
return
-Anweisung zu haben.
Sie können aber eine haben und zwar ohne Ausdruck (Beispiel:
return;
), was aber nicht empfohlen wird.
In der Strukturierten Programmierung wird unter anderem verlangt, dass jede Methode nur genau einen Eingang und genau einen Ausgang hat.
Hinweis: Bei Strukturierter
Programmierung muss daher die return
-Anweisung immer Teil der
letzten Anweisung sein!
Quelltext-Beispiel 9 überspringen
int vergleiche() throws IOException
{
BufferedReader eingabe = new BufferedReader(new InsputStreamReader(System.in);
int rateZahl = Integer.parseInt(eingabe.readLine());
if (rateZahl == zielZahl)
return 0;
else
if (rateZahl < zielZahl)
return -1;
else
return 1;
}
nicht:
if (rateZahl == zielZahl)
return 0;
if (rateZahl < zielZahl)
return -1;
if (rateZahl > zielZahl)
return 1;
Hinweis: Die continue
-Anweisung ist in
der Strukturierten Programmierung nicht erlaubt!
Exkurs:
Manche if
-Anweisungen
können elegant durch den
ternären Bedingungsoperator ersetzt werden:
Bedingungsausdruck ? Ausdruck1 : Ausdruck2
Bedingungsausdruck muss vom Typ boolean
sein, wenn true
, wird Ausdruck 1 ausgewertet,
bei false
Ausdruck 2.
Ausdruck 1 und Ausdruck 2 müssen immer von der gleichen
Art sein, also beispielsweise numerischer Datentyp, boolean
oder Referenzdatentyp.
Quelltext-Beispiel 10 überspringen
if (rateZahl == zielZahl)
return 0;
else
return (rateZahl < Zielzahl) ? -1 : 1;
oder:
return (rateZahl == zielZahl) ? 0 : (rateZahl < zielZahl) ? -1 : 1;