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’ );
do-while-Schleife
- = „Führe einen Block aus und wiederhole ihn, solange eine Bedingung
erfüllt ist.“ - Testausdruck wird nach Ausführung der Anweisungen ausgewertet.
- Ist er erfüllt, wird mit erstem Befehl innerhalb der Schleife fortgefahren.
- Ist er nicht erfüllt, wird mit dem ersten Befehl hinter der Schleife fortgefahren.
- Der Schleifenrumpf wird mindestens einmal durchlaufen
(nichtabweisende Schleife).
for schleife
- Häufigster Einsatz bei fester Anzahl von Durchläufen.
- Besteht aus drei Teilen:
- Initialisierungsteil: Legt Startwert der Laufvariablen fest, ggf. Definition Laufvariable
(Datentyp). Variable ist nur innerhalb der Schleife gültig. - Bedingungsteil: Definition der Ausführungsbedingung als Boolschen Ausdruck
(true = Ausführung, false = Abbruch). - Veränderungsteil: Definition der Veränderung der Laufvariablen nach dem
Schleifendurchlauf (i.d.R. Inkrementierung oder Dekrementierung) - Testausdruck wird vor Ausführung der Anweisungen ausgewertet.
- Ist er nicht erfüllt, wird mit erstem Befehl nach der Schleife fortgefahren.
- Der Schleifenrumpf wird u.U. nicht ein einziges Mal durchlaufen.
(abweisende Schleife)
Syntax:
for(Initialisierung; Testausdruck; Veränderung)
Anweisung oder Anweisungsblock
● Initialisierung, Testausdruck und Veränderung sind optional.
● Fehlt der Testausdruck wird wahr angenommen.
● Anwendung ist nicht auf das Durchzählen beschränkt, es können beliebige
Ausdrücke genutzt werden.
for (int i = 1; i <= 10; i++) {
printf(“%d “, i);
}
int i, j;
for (i = 1, j = 10; i < j; i++, j–) {
printf(“(%d, %d) “, i, j);
}
was sind komplexe schleifenköpfe bei for schleifen?
- Initialisierungs- und Veränderungsteil eines Schleifenkopfes können aus
mehreren Anweisungen bestehen. - Im Initialisierungsteil können Variablen deklariert werden, die im
Veränderungsteil unabhängig voneinander variiert werden.
meistens schlechter stil und schwer lesbar
beispiel für eine verschachtelung von schleifen?
for(int i = 0; i < 5; i++) {
for(int j = 0; j < 5; j++) {
printf(“%d\t”, i*j);
}
printf(“\n”);
}
was sind sprunganweisungen?
break
-anwendung in allen schleifen und switch anweisung
-springt hinter die schleife/ den switch block
continue
-anwendung in allen schleifen
-springt zum testausdruck, bei der for schleife wird zuvor der veränderungsausdruck ausgeführt
return
-anwendung an jeder posiiton
beendet die aktuelle funktion, rückkehr zum aufrufenden programmteil mit rückgabewert
!!! häufiges verwenden von sprunganweisugnen kann zu unübersichtlichen Programmen führen
sprunganweisungen werden verwendet, um endlosschleifen zu verlassen