Post on 05-Apr-2015
C- Syntax
Bestandteile der Sprache C:
•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
ArithmetischeAusdrücke
Beispiele:In allen folgenden Beispielen wird stillschweigend vorausgesetzt, dass die benutzten Variablen alle vorher deklariert wurden!!!
3Literal (Konstante),
Wert des Ausdrucks: 3
3+5-2 Wert des Ausdrucks: 6
3+kein Ausdruck
(syntaktisch falsch)
x Variable, Wert des Ausdrucks: unbekannt,
da der Wert von x in diesem Zusammenhang dem Programmierer nicht bekannt ist.
2x keine Variable: Variablenname darf nicht mit einer Ziffer beginnen !
(syntaktisch falsch)
3+x-2x kein Ausdruck, da * in 2x fehlt(syntaktisch falsch)
x+3
x-y/b+3-(3+y)*4Wert des Ausdrucks: unbekannt
27%4ganzzahliger Rest bei der Division:
27 : 4 = 6 Rest 3, also Wert des Ausdrucks: 3
/ bedeutet Division, zuerst werden Klammern ausgewertet,
dann Punkt vor Strich
Ausdruck, Wert des Ausdrucks: unbekannt
26%4
a++ erhöht a um 1, Wert des Ausdrucks: unbekanntb--
verringert b um 1,Wert des Ausdrucks: unbekannt
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 ganzzahliger Rest bei der Division: 24 : 4 = 6 Rest 0, also
Wert des Ausdrucks: 0
Relationale und logische Ausdrücke
Relationale und logische Ausdrücke sind
wahr oder falsch
Kleiner Ausflug in die formale Logik
Die zusammengesetzte Aussage A UND Bist nur wahr, wenn A und B wahr sind, ansonsten ist sie falsch
Die zusammengesetzte Aussage A ODER Bist nur falsch, wenn A und B falsch sind, ansonsten ist sie wahr.
Die negierte Aussage NICHT Aist falsch, wenn A wahr ist und wahr, wenn A falsch ist.
Diese Zusammenhänge lassen sich auch mit einer
sogenannten Wahrheitstafeln darstellen:
A B A und B A oder BW W W WW F F WF W F WF F F F
A nicht AW FF W
C kennt aber kein "wahr" oder "falsch", sondern:
Ausdruck Wertfalsch 0
wahr 1
C++ kennt aber "wahr" oder "falsch":
Ausdruck Wertfalsch false
wahr true
Beispiele:
0 < 5
8 > 9x+3 >= 51 == 2 Wert: 0
1 != 3
Wert: 1
Wert: 0
Wert: 1
Wert hängt von x ab.
mathematisches =
mathematisches
4 < x < 7
Relationale Operatoren sind zweistellig und dürfen nur mit zwei Operanden arbeiten. Deswegen ist folgende Zeichenkette kein Ausdruck:
LogischeAusdrücke
Beispiele:
a && b
x || y(x>0) && (x<10)!(x<y)
logisches UND
logisches ODER
logisches NICHT
0 && 1
0 || 0!0!1
Wert: 0
Wert: 0
Wert: 1
Wert: 0
Was macht der Compiler, wenn er Ausdrücke der folgenden Art auswerten soll ?
3 && 4
7 || 9.5!17!13.1425
C wertet wie folgt aus:
Ausdruck Wertfalsch 0
wahr 0
Wert: 1
Wert: 1
Wert: 0
Wert: 0
3 && 4
7 || 9.5!17!13.1425
3 ungleich 0, also wahr, also Wert: 1
4 ungleich 0, also wahr, also Wert: 1
OperatorenArithmetische 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 : 17Nebenwirkung: Wert der Variablen a ist 17
Wert des Ausdrucks : 11Nebenwirkung: 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 ?
y = x = 2
Wert des Ausdrucks : 2Nebenwirkung: Wert der Variablen y ist 2
Abarbeitung:von rechts nach links
Wert des Ausdrucks : 2Nebenwirkung: Wert der Variablen x ist 2
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)
y = x = 2
Weil links des Zuweisungszeichens (also =) eine Variable stehen muss.
Aber warum macht diese Zuweisung Probleme?
Dies ist noch syntaktisch korrekt, aber....
Wäre der Ausdruck syntaktisch korrekt, wenn Abarbeitung von links nach rechts geschehen würde?
Hier steht aber keine Variable, sondern eine Zuweisung, also ist dies syntaktisch falsch !!
a=(x=5)*3
Wert des Ausdrucks : 15Nebenwirkung: Wert der Variablen a ist 15
Wert des Ausdrucks : 5Nebenwirkung: Wert der Variablen x ist 5
x=x+20Welchen Wert hat x nach dem Zuweisungsausdruck?
Da x nach dem letzten Zuweisungsausdruck den Wert 5 erhalten hat, hat x jetzt den Wert 5 + 20, also 25
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.
++aErhöht den Wert der Variablen a um eins vor der
Verwendung in einem Ausdruck.
--aVerringert den Wert der Variablen a um eins vor
der Verwendung in einem Ausdruck.
Beispiele dazu:Welche
Bildschirmausgaben erzeugt folgendes
Programm?
int main(){int i;i=10;
printf("Wert nach i++ ist %d\n",i++);
printf("Wert nach i-- ist %d\n",i--);
printf("Wert nach ++i ist %d\n",++i);
printf("Wert nach --i ist %d\n",--i);
return 0;}
Wert nach i++ ist 10
Wert nach i-- ist 11
Wert nach ++i ist 11
Wert nach --i ist 10
printf("Wert nach i++ ist %d\n",i++);
Durch welche 2 Anweisungen kann man diese Anweisung also simulieren?
printf("Wert nach i++ ist %d\n", i); i=i+1; printf("Wert nach i-- ist %d\n",i--); printf("Wert nach i-- ist %d\n", i); i=i-1; printf("Wert nach ++i ist %d\n", ++i); i=i+1; printf("Wert nach ++i ist %d\n", i); printf("Wert nach --i ist %d\n", --i); i=i-1; printf("Wert nach --i ist %d\n", 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?
a=(x==x+1)+4
Wert des Ausdrucks : 4Nebenwirkung: Wert der Variablen a ist 4
Wert des Ausdrucks : 0
Dieser Ausdruck ist – egal welchen Wert x besitzt - immer falsch !!
Warum wird zu x erst 1 addiert und
Weil dies in der Norm so festgelegt ist!Nähers dazu später! (Priorität = Vorrang)
Nicht zuerst x auf Gleichheit mit x geprüft?
x+=y
Dies ist eine abkürzende Schreibweise für ...
x=x+yDas gleiche gilt für:
*= -= usw.
Priorität und Assoziativität bei Operatoren.
Siehe Hilfe-Menü von MSVC++ Stichwort:
precedence
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
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 ?
3 * 6 / 9
18
2
Deswegen wird zuerst 3*6 (= 18) berechnet und dann 18/9 (=2)
3 * 6 / 9
0
0
Welches Ergebnis hat der Ausdruck, wenn * und / rechtsassoziativ wären?
da 6 und 9 integer sind
60 / 10 / 2
Wie wird der Wert dieses Ausdrucks berechnet ?
60 / 10 / 2
6
3
Deswegen wird zuerst 60/10 (= 6) berechnet und dann 6/2 (=3)
60 / 10 / 2
5
12
Welches Ergebnis hat der Ausdruck, wenn / rechtsassoziativ wäre?
Bemerkungen:Ein einstelliger (unärer) Operator arbeitet mit einem Operand, wie zum Beispiel: -xEin 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 C gibt es nur einen ternären Operator (den wir hier nicht besprechen).
In der folgenden Folie bedeutet:A : Assoziativität L : Linksassoziativität R : Rechtsassoziativität S : Stelligkeit U : unär (einstellig) B : binär (zweistellig) T : ternär (dreistellig)
Pri
orit
ät n
imm
t von
obe
n na
ch u
nten
ab
Operatoren A S() [] -> . L B* + - ! ~ ++ -- & (typ) sizeof R U
* / % L B+ - L B<< >> L B< <= > >= L B== != L B& L B^ L B¦ L B&& L B¦¦ L B?: R T= += -= *= /= %= &= ^= ¦= <<= >>= R B
, L B
Reihenfolge der Auswertung
a==b && a!=b
Wie wird der Wert dieses Ausdrucks berechnet ?
Diese Operatoren haben die gleiche Priorität. Sie ist grösser als die Priorität von &&
Welch(e)r Operator(en) hat (haben) die höchste Priorität ?
Deswegen werden die Ausdrücke zuerst ausgewertet
Da aus logischen Gründen einer dieser 2 Ausdrücke falsch ist, hat dieser Ausdruck den Wert 0
Weiter mit:
Aufgaben aus dem Arbeitsblatt lösen.
(Prioritätentabelle befindet sich auf meiner Website
bzw. wird ausgeteilt).
1) Welche der folgenden Zeichenreihen sind syntaktisch korrekte Ausdrücke (in der Programmiersprache C) und welche Werte haben diese Ausdrücke ?
Geben Sie selbst Ausdrücke an. Überprüfen Sie Ihre Ergebnisse mit Hilfe der Entwicklungsumgebung von Visual C++
Ausdruck Wert
3 = 2+7
3 * 3 + 4 * 4 == 5 * 5
x = 7 /*8+34
2x = x + x
y == y+1
7 && 8
7 || 8
!23
!7 || !8
i=(3==5)
i!=(4==4)
2) Formulieren Sie die folgenden mathematischen Ausdrücke als syntaktisch korrekte Ausdrücke in der Programmiersprache C.
z = 2+6/3
4 x 2 Möglichkeiten
2 < x < 5
a x < 8
1 < x 7
b x 9
c x 7
6 x
d > x > r
a x 83
1 > x 17
b x 9.4
y > x
b x
u < 3.14
w x 7
v 23
x!=5 2 Möglichkeiten