4_Ausdrücke

Werbung
Java- Syntax
Bestandteile der Sprache
Java:
•Ausdrücke
•Anweisungen
Ausdruck
Ein Ausdruck ist eine Folge von
Operatoren und Operanden. Ein
Ausdruck ist - grob gesagt ein Term oder eine
mathematische Formel.
Jeder Ausdruck hat einen
Wert !!
Es gibt folgende
Ausdrücke:
- arithmetische Ausdrücke
- relationale und logische
Ausdrücke
- Zuweisungsausdrücke
Arithmetische
Ausdrücke
Beispiele:
In allen folgenden Beispielen
wird stillschweigend
vorausgesetzt, dass die
benutzten Variablen alle vorher
deklariert wurden!!!
3
Literal (Konstante),
Wert des Ausdrucks: 3
3+5-2
3+
xy
Wert des Ausdrucks: 6
kein Ausdruck
(syntaktisch falsch)
Variable,
Wert des Ausdrucks: unbekannt,
da der Wert von xy in diesem Zusammenhang dem
Programmierer nicht bekannt ist.
2x
keine Variable: Variablenname darf
nicht mit einer Ziffer beginnen !
(syntaktisch falsch)
3+x-2x
x+3
kein Ausdruck, da * in 2x fehlt
(syntaktisch falsch)
Ausdruck,
Wert des Ausdrucks: unbekannt
/ bedeutet Division,
zuerst werden Klammern ausgewertet,
dann Punkt vor Strich
x-y/b+3-(3+y)*4
Wert des Ausdrucks: unbekannt
27%4
ganzzahliger Rest bei der Division:
27 : 4 = 6 Rest 3, also
Wert des Ausdrucks: 3
26%4
ganzzahliger Rest bei der Division:
26 : 4 = 6 Rest 2, also
Wert des Ausdrucks: 2
25%4
ganzzahliger Rest bei der Division:
25 : 4 = 6 Rest 1, also
Wert des Ausdrucks: 1
24%4
a++
b--
ganzzahliger Rest bei der Division:
24 : 4 = 6 Rest 0, also
Wert des Ausdrucks: 0
erhöht a um 1,
Wert des Ausdrucks: unbekannt
verringert b um 1,
Wert des Ausdrucks: unbekannt
Relationale
und logische Ausdrücke
Relationale und logische
Ausdrücke sind
wahr (true)
oder
falsch (false)
und haben den Datentyp
boolean
Kleiner Ausflug in die
formale Logik
Die zusammengesetzte
Aussage A UND B
ist nur wahr, wenn A und B
wahr sind, ansonsten ist sie
falsch
Die zusammengesetzte
Aussage A ODER B
ist nur falsch, wenn A und
B falsch sind, ansonsten ist
sie wahr.
Die negierte Aussage
NICHT A
ist falsch, wenn A wahr ist
und wahr, wenn A falsch
ist.
Diese Zusammenhänge
lassen sich auch mit einer
sogenannten
Wahrheitstafeln darstellen:
A
W
W
F
F
B A und B A oder B
W
W
W
F
F
W
W
F
W
F
F
F
A nicht A
W
F
F
W
Java kennt aber kein
"wahr" oder "falsch",
sondern:
Ausdruck
falsch
Wert
false
wahr
true
Beispiele:
Wert: true
0 < 5
8 > 9
x+3 >= 5
1 == 2
1 != 3
Wert: false
Wert hängt von x ab:
Für x grösser oder gleich 2: true
Für x kleiner 2: false
mathematisches =
Wert: false
mathematisches 
Wert: true
Relationale Operatoren sind
zweistellig und dürfen nur mit
zwei Operanden arbeiten.
Deswegen ist folgende
Zeichenkette kein Ausdruck:
4 < x < 7
Logische
Ausdrücke
Beispiele:
a && b
x || y
(x>0) && (x<10)
!(x<y)
logisches ODER
logisches UND
logisches NICHT
Operatoren
Arithmetische Operatoren:
+
-
*
/
%
++
--
Vergleichsoperatoren:
<
<=
>
>=
==
!=
Logische Operatoren:
! && ||
Bitweise Operatoren:
~
& |
Zuweisungsausdrücke
Ein Zuweisungsausdruck
enthält einen
Zuweisungsoperator wie z.B.
=
+=
++
--
Ein Zuweisungsausdruck ist
ein Ausdruck, keine
Anweisung, der eine
Wirkung (Nebenwirkung)
hat, nämlich die Zuweisung.
Diese Zuweisung verändert
den Wert der Variablen.
Da ein Zuweisungsausdruck
ein Ausdruck ist, hat ein
Zuweisungsausdruck also
einen Wert !!!
Beispiele:
a = 17
x = 3+2*4
Wert des Ausdrucks : 17
Nebenwirkung:
Wert der Variablen a ist 17
Wert des Ausdrucks : 11
Nebenwirkung:
Wert der Variablen x ist 11
Punkt vor Strich.
Dies bedeutet, dass dass z.B. die
Multiplikation Priorität (=Vorrang)
vor der Addition hat
y = x = 2
Wie wird der Wert diesen Ausdrucks
berechnet ?
Warum Abarbeitung von rechts nach links?
Weil dies in der Norm so festgelegt ist!
Nähers dazu später! (Assoziativität = Auswertung eines Ausdrucks
von rechts oder links)
Abarbeitung:
von rechts nach links
Wert des Ausdrucks : 2
Nebenwirkung:
Wert der Variablen y ist 2
y = x = 2
Wert des Ausdrucks : 2
Nebenwirkung:
Wert der Variablen x ist 2
Wert des Ausdrucks : 15
Nebenwirkung:
Wert der Variablen a ist 15
Wert des Ausdrucks : 5
Nebenwirkung:
Wert der Variablen x ist 5
a=(x=5)*3
a++
a-++a
--a
Erhöht den Wert der Variablen a um eins nach der
Verwendung in einem Ausdruck.
Verringert den Wert der Variablen a um eins nach
der Verwendung in einem Ausdruck.
Erhöht den Wert der Variablen a um eins vor der
Verwendung in einem Ausdruck.
Verringert den Wert der Variablen a um eins vor
der Verwendung in einem Ausdruck.
Beispiele dazu:
Welche Bildschirmausgaben
erzeugt folgendes Programm?
(Zwecks Platzersparnis wird hier
wieder System.out.println durch
println abgekürzt.)
int main(){
int i;
i=10;
Wert von i wird erst nach dieser Anweisung erhöht
println("Wert nach i++ ist: "+ i++);
Wert von i wird erst nach dieser Anweisung verringert
println("Wert nach i–- ist: "+ i--);
Wert von i wird schon vor dieser Anweisung erhöht
println("Wert nach ++i ist: "+ ++i);
Wert von i wird schon vor dieser Anweisung verringert
println("Wert nach --i ist: "+ --i);
}
also Bildschirmausgabe:
10
11
11
10
println("Wert
println("Wert
i=i+1;
println("Wert
println("Wert
i=i-1;
println("Wert
i=i+1;
println("Wert
println("Wert
i=i-1;
println("Wert
Durch welche 2
Anweisungen kann man
diese Anweisung also
simulieren?
nach i++ ist: "+ i++);
nach i++ ist: "+ i);
nach i-- ist: "+ i--);
nach i-- ist: "+ i);
nach ++i ist: "+ ++i);
nach ++i ist: "+ i);
nach --i ist: "+ --i);
nach --i ist: "+ i);
Durch welche 2 Anweisungen kann
man diese Anweisung also simulieren?
Durch welche 2 Anweisungen kann
man diese Anweisung also simulieren?
Durch welche 2 Anweisungen kann
man diese Anweisung also simulieren?
Dies ist eine abkürzende
Schreibweise für ...
x+=y
x=x+y
Das gleiche gilt für:
*= -=
usw.
Priorität und Assoziativität
bei Operatoren.
und nicht: (3 + 5) * 6 = 48
Ein Operator hat höhere
Priorität bedeutet, daß die
zugehörige Operation zuerst
ausgeführt wird, wie z.B:
3+5*6
(Punkt vor Strich)
= 3 + (5 * 6) = 33
also hat * eine höhere
Priorität als +
Wenn zwei Operatoren die
gleiche Priorität haben,
bestimmt die Assoziativität,
welche Operation zuerst
ausgeführt wird.
Beispiel:
* und / haben die gleiche
Priorität und die
Assoziativität von Links
nach Rechts (kurz: L).
3*6/9
Wie wird der Wert dieses Ausdrucks
berechnet ?
2
18
3*6/9
Deswegen wird zuerst 3*6 (= 18)
berechnet und dann 18/9 (=2)
0
0
da 6 und 9 integer sind
3*6/9
Welches Ergebnis hat der Ausdruck,
wenn * und / rechtsassoziativ wären?
60 / 10 / 2
Wie wird der Wert dieses Ausdrucks
berechnet ?
3
6
60 / 10 / 2
Deswegen wird zuerst 60/10 (= 6)
berechnet und dann 6/2 (=3)
12
5
60 / 10 / 2
Welches Ergebnis hat der Ausdruck,
wenn / rechtsassoziativ wäre?
Bemerkungen:
Ein einstelliger (unärer)
Operator arbeitet mit einem
Operand, wie zum Beispiel: -x
Ein zweistelliger (binärer)
Operator arbeitet mit 2
Operanden, wie zum Beispiel:
x-y, x+y, x*y, x/y, x%y,
Ein dreistelliger (ternärer)
Operator arbeitet mit 3
Operanden. In Java gibt es nur
einen ternären Operator (den
wir hier nicht besprechen).
Hier werden folgende
Abkürzungen benutzt:
A : Assoziativität
L : Linksassoziativität
R : Rechtsassoziativität
S : Stelligkeit
U : unär (einstellig)
B : binär (zweistellig)
T : ternär (dreistellig)
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Operatoren
[]
()
.
++
-++
-+ ~
!
(type)
new
*
/
%
+ +
<<
>>
>>>
<
<=
>
>=
instanceof
==
!=
&
^
|
&&
&
||
|
? :
=
*= /=
%=
+= -=
<<=
>>=
>>>=
&=
^=
|=
Bedeutung
Array-Index
Methodenaufruf
Komponentenzugriff
Postinkrement
Postdekrement
Präinkrement
Prädekrement
Vorzeichen (unär)
bitweises Komplement
logischer Negationsoperator
Typ-Umwandlung
Erzeugung
Multiplikation, Division, Rest
Addition, Subtraktion
Stringverkettung
Linksshift
Vorzeichenbehafteter Rechtsshift
Vorzeichenloser Rechtsshift
kleiner, kleiner gleich
größer, größer gleich
Typüberprüfung eines Objekts
Gleichheit
Ungleichheit
bitweises UND
bitweises Exclusiv-ODER
bitweises ODER
logisches UND
logisches ODER
Bedingungsoperator
Wertzuweisung
kombinierter Zuweisungsoperator
Assoz.
L
L
L
L
L
R
R
R
R
R
R
R
L
L
L
L
L
L
L
L
L
L
L
L
L
L
L
L
R
R
R
Priorität nimmt von oben nach unten ab
Priorität
1
Welche Operatoren sind
rechtsassoziativ,
welche
linksassoziativ?
Rechtsassoziativ sind:
Zuweisungsoperatoren, der
Bedingungsoperator, und unäre
Operatoren.
Linksassoziativ sind:
alle anderen
Wie wird der Wert dieses Ausdrucks, der aus
boolean-Variablen besteht, berechnet (beachten
Sie Priorität und Assoziativität) ?
a==b && b!=a
Hier ein paar Vorschläge:
a==(b && (b!=a))
(a==(b && b))!=a
(a==b) && (b!=a)
Welch(e)r Operator(en) hat (haben) die höchste Priorität ?
a==b && b!=a
&& ist linksassoziativ,
deswegen wird dieser
Ausdruck zuerst
ausgewertet und dann...
Diese Operatoren haben die
gleiche Priorität. Sie ist
grösser als die Priorität von
&&
dieser Ausdruck
Da aus logischen Gründen einer dieser 2 Ausdrücke falsch ist, hat
dieser Ausdruck den Wert false
Herunterladen