Informatik W03
Levin Ceglie
Outline
- Admin
- Repetition Vorlesung via Quiz
- Expressions
- For-Loops
- Debugging
- Freies Aufgabenlösen
Admin
Fragen aus letzter Woche
- Cheatsheet?
- siehe n.ethz.ch/~lceglie/
Weiteres
- Haben alle das Email erhalten?
- Link für anonymes Feedback auf der Webseite.
- Fragen zu den Aufgaben letzter Woche?
L- und R-Werte
a=b=c=2;Die Frage: Ist expr ein lvalue? Lässt sich beantworten, indem man folgende Frage betrachten: Kann ich expr = 5; schreiben?
Demonstration Code Expert (geht über den momentanen Stoff hinaus).
Expressions
Präzedenzen
Länge nicht geklammerte Ausdrucke werden vom Compiler mittels einer Präzedenztabelle gelesen (siehe C++ Operator Precedence - cppreference.com). Allgemeine Merkregel: (American Rugby League)
Persönliche Empfehlung: Präzedenztabelle auf dem Spick für die Prüfung!
Assoziativität
Für manche Expressions reicht es nicht nur die Präzedenzen zu kennen. Betrachte
false && false && trueWenn man versucht diesen Ausdruck nur unter Benutzung der Präzedenzen zu lesen führt dies zu Ambiguität. Man muss zusätzlich die sogenannte Assoziativität beachten (siehe wiederum C++ Operator Precedence - cppreference.com). Der && Operator ist links-assoziativ. Das bedeutet, dass die Expression wie folgt ausgewertet wird.
(false && false) && trueAlso der Operator der weiter Links steht wird zuerst ausgelesen.
Short Circuit Evaluation
Bei den Operatoren && und || werden die Expressions nur ausgewertet solange der Wert nicht eindeutig ist. Zum Beispiel muss bei 5 < 2 && x < 3 nur 5<2 ausgewertet werden, da dies bereits false ist, ist der Wert der ganzen Expression schon eindeutig und die rechte Seite (x<3) muss nicht ausgewertet werden.
Beispiele
Klammere den folgende Ausdrücke so dass es der Auswertung des Compilers entspricht.
3 < 4 + 1 && 2 < 33 == 3 * 2 || 5 <= 2+3 && trueLösung:
(3 < (4 + 1)) && (2 < 3)(3 == (3 * 2)) || ((5 <= (2+3)) && true)Werte die folgende Expression aus:
2 > 3 && 17u - 55 <= ++x % yHinweis: Klammere zuerst die Expression
Lösung:
2 > 3 && 17u - 55 <= ++x % y
(2 > 3) && ((17u - 55) <= ((++x) % y))
false && ((17u - 55) <= ((++x) % y))
falseWerte die folgende Expression aus:
!(1 < 2 && x == 1) + 1Lösung:
(!((1 < 2) && (x == 1))) + 1
(!(true && (x == 1))) + 1
(!(true && true)) + 1
(!true) + 1
false + 1
0 + 1
1Bemerkung: Vom Konvertieren von Integers zu Booleans wird generell abgeraten. Die Umkehrung, also das Konvertieren von Booleans zu Integers ist kein Problem.
ACHTUNG: Die Operatoren && und || haben die Spezielle Eigenschaft, das in den folgenden Expressions a garantiert vor b ausgewertet wird.
a && b
a || bDies gilt nicht für Operatoren wie +, die folgende Expression gilt nach unserem C++ Standard als undefiniertes Verhalten
int i = 1;
int a = ++i + i;For Loops
Um die For Loop in C++ zu verstehen muss man bloss folgendes Darstellung verstehen.

Aufgabe (Strange Sum)
Schreibe ein C++ Programm, welches eine natürliche Zahl einliest und alle positiven ungeraden Zahlen kleiner gleich , welche nicht durch 5 teilbar sind ausgibt.
Musterlösung:
#include <iostream>
int main () {
// input
unsigned int strangesum = 0;
unsigned int n;
std::cin >> n;
// computation
for (unsigned int i = 1; i <= n; i++) {
if (i % 2 == 1) {
if (i % 5 != 0) {
strangesum += i;
}
}
}
// output
std::cout << strangesum << "\n";
return 0;
}Bemerke: Man könnte die if statements kombinieren zu
if (i % 2 == 1 && i % 5 != 0) {
strangesum += i;
}und man könnte sogar die erste Bedingung weglassen, indem man die for-loop anpasst:
for (unsigned int i = 1; i <= n; i += 2) {
if (i % 5 != 0) {
strangesum += i;
}
}Aufgabe (Largest Power)
Schreibe ein C++ Programm, welches eine positive natürliche Zahl einliest und dann die grösste Zweierpotenz () ausgibt, welche kleiner oder gleich der Zahl ist.
Musterlösung:
#include <iostream>
int main () {
unsigned int n;
std::cin >> n;
unsigned int power = 1;
for (; power <= n / 2; power *= 2);
std::cout << power << std::endl;
return 0;
}Debugging
Gemeinsames Debuggen von non_terminating.cpp