Vorlesung 7 Flashcards
was sind operatoren, operanden und ausdrücke?
operatoren dienen zum verknüpfen von operanden
z.b. +,*
in C gibt es ein, zwei und dreistellige operatoren
operanden sind argumente der operatoren
in C; Literale, variablen, funktionsaufrufe oder ausdrücke
ausdrücke sind kombinationen aus variablen, literalen , operatoren und rückgabewerten von funktionen
auswertung eines ausdrucks ergibt einen wert.
Beispiel: -c1 + c2 - 5 * (f(j) - 10)
auswertungs reihenfolge von operatoren?
Gruppierung (Auswertungsreihenfolge)
1. geklammerte Teilausdrücke
2. einstellige Postfix-Operatoren
3. einstellige Präfix-Operatoren
4. mehrstellige Operatoren gemäß Vorrangregeln (z.B. „Punkt vor Strich“)
● Assoziativität: Auswertungsreihenfolge bei Operatoren der gleichen
Vorranggruppe (in C meist linksassoziativ, d.h. von links nach rechts)
● Tipp zur Fehlervermeidung: Häufig Klammerung benutzen
was sind lvalue, rvalue und seiteneffekte?
lvalue: Ausdruck, dem Wert zugewiesen werden kann (z.B. Variable)
rvalue: Ausdruck, dem kein Wert zugewiesen werden kann
wie kann man die operatoren in C gruppieren?
Arithmetische Operatoren +, -,
*
, …
* Zuweisungsoperatoren =
, +=, …
* Inkrement- und Dekrement-Operatoren ++, –
* Relationale Operatoren ==
, !=, …
* Logische Operatoren &&, ||, …
* Bitweise Operatoren &, |, …
* Sonstige Operatoren sizeof …
was sind arithmetische operatoren?
Zweistellig, keine Seiteneffekte
● Linksassoziativ, d.h. A + B + C ist gleichbedeutend mit (A + B) + C
● Es seien A und B Ausdrücke
* Additionsoperator: A + B
* Substraktionsoperator: A - B
* Multiplikationsoperator: A * B
* Divisionsoperator: A / B
* Bei Integer-Division wird der Nachkommateil des Ergebnisses abgeschnitten
* Restwertoperator: A % B
* Nur für ganzzahlige Operanden (char, int) definiert
was sind zuweisungsoperatoren?
● Rechtsassoziativ, d.h. A = B = C ist gleichbedeutend mit A = (B = C)
● Automatische Konvertierung, wenn die Operatoren von unterschiedlichen,
aber kompatiblen Datentypen sind
● Kombinationen mit arithmetischer/bitweiser Operation
* Additionszuweisung: A += B (entspricht A = A + B)
* Substraktionszuweisung: A -= B (entspricht A = A - B)
* Weitere: A *= B, A /= B, A %= B, A &= B, A |= B, A «= B, A»_space;= B
* Vorteil: Effiziente Umsetzung in Maschinensprache möglich
Inkrement- und Dekrementoperatoren
● Inkrementoperatoren erhöhen den Wert einer Variablen,
Dekrementoperatoren senken ihn.
● Beispiel:
int k, l, m;
k = 5;
k++;
–k;
l = k++;
m = –k;
wichtig, unterschied ob k++ oder ++k
Relationale Operatoren
Ermöglichen Vergleiche zwischen Werten.
* Ergebnis ist 0 oder 1.
if(x == y) {
printf(“x ist gleich y.\n”);
}
if(x != y) {
printf(“x ist ungleich y.\n”);
}
if(x >= y) {
printf(“x ist größer oder gleich y.\n“);
}
Logische Operatoren
Ermöglichen Auswertung von logischen Aussagen.
* Ergebnis ist 0 und 1
int adult = (age > 17);
if(adult) {
printf(“You are an adult.”);
}
if(age > 17) {
printf(“You are an adult.”);
}
if(age >= 13 && age < 20) {
printf(“You are a teenager.”);
}
if(age < 13 || age > 19) {
printf(“You are not a teenager.”);
}
if(!(age >= 13 && age < 20)) {
printf(“You are not a teenager.”);
}
Bitweise Operatoren
● Bitweise Operatoren arbeiten auf der internen binären Darstellung
der Operanden.
● Verknüpfung zweier Operanden Bit für Bit:
& UND | ODER ^ EXCLUSIV-ODER ~ Einer-Komplement (invertieren)
● Frage: Was liefert 10 & 6 ?
● Bitweises Verschieben von x um y (Binär-)Stellen nach links
(x «_space;y) oder rechts (x»_space; y), auffüllen mit 0en
● x = y «_space;z entspricht rechnerisch x = y * 2z
● x = y»_space; z entspricht rechnerisch x = y / 2z
wie funktioniert die bedingte zuweisung?
- Der ?-Operator erlaubt die Auswahl einer Zuweisung anhand von
Bedingungen:
Bedingung ? Ausdruck bei true : Ausdruck bei false - Zunächst wird die Bedingung ausgewertet. Ist das Ergebnis wahr (≠0), dann
wird der erste Ausdruck zurückgegeben, sonst der zweite.
ist meistens unübersichtlich, nur bei offensichtlichen bedingungen verwenden
Sonstige Operatoren
● Funktionsaufruf: F(X), Aufruf der Funktion F mit Parametern X
● Typkonvertierung: (Typ) A, wandelt A in den angegebenen
Typ um
● Adressoperator: &
● Dereferenzierungsoperator: *
● Feldindex-Operator: A[B]
● Elementauswahloperatoren: A.B, A->B
* sizeof: liefert interne Größe einer Variablen oder eines Typs
* Beispiel: s = sizeof(float);
* Komma-Operator (A, B): wertet die Ausdrücke A und B nacheinander aus und
liefert das Ergebnis von B
Anweisungen, definition?
- Anweisungen definieren den Programmfluss, sorgen für die grobe Struktur
einer Funktion und geben den logischen und funktionalen Unterbau. - Ausdrucksanweisung: Ein Ausdruck wird zu einer Anweisung, indem ;
angefügt wird. - Leere Anweisung: ;
- Blöcke: Zusammenfassung von Deklarationen und Anweisungen in { }
(z.B. in Funktionsdefinitionen). Ein Block gilt als eine Anweisung. - Spezialfall: Block kann leer sein. {}
wofür dienen schleifen im allgemeinen?
- Schleifen werden benutzt, um eine Anweisung oder einen Block von
Anweisungen wiederholt auszuführen. - Logische Ausdrücke definieren eine Abbruchbedingung.
- Prüfung kann am Anfang oder am Ende der Schleife stattfinden.
- Bei jedem Durchlauf wird diese Bedingung untersucht, ist das Ergebnis falsch,
wird die Schleife verlassen. - Schleifen ändern die sequentielle Ausführung eines Programms.
while schleife
- = „Solange eine Bedingung erfüllt ist, führe ein Block aus.“
- Testausdruck wird vor Ausführung der Anweisungen ausgewertet
- Ist er falsch, wird mit erstem Befehl nach der Schleife fortgefahren.
- Nach der Ausführung der Anweisung(en) wird der Testausdruck erneut
geprüft. - Schleife wird so lange durchlaufen, bis Testausdruck „false“ ergibt.
- Der Schleifenrumpf wird unter Umständen nicht ein einziges Mal durchlaufen
(abweisende Schleife).
Syntax:
while (Testausdruck)
Anweisung oder Anweisungsblock
● Beispiel (Ausgabe der Zahlen 1 bis 10):
int i = 1;
while (i <= 10) {
printf(“%d “, i);
i++;
}
● Beispiel (Warten auf Eingabe ‘e’):
5
int i = 1;
while (i <= 10) {
printf(“%d “, i);
i++;
}
int c;
while ( (c=getchar()) != ‘e’ );