Operatoren und Ausdrücke

Bearbeite die folgenden Aufgaben ohne Hilfe eines C-Compilers, d.h. nur auf Papier. Überprüfe sie anschliessend mit einem entsprechenden C-Programm.

Aufgabe 1: Operatoren auf Literalen

Welche Werte ergeben die folgenden Ausdrücke? Welche Datentypen haben sie?

  1. 3 * 2 + 18 / 3 - 15 % 4
  2. true && false || false && true || true && !false
  3. 13 > 30 / 2 || 12 >= 3 * 4 && !(3 <= 12 / 4)
  4. sizeof(int) <= sizeof(char) || sizeof(long) < sizeof(short)

Aufgabe 2: Operatoren auf Variablen

Gegeben sind die folgenden Variablen:

char a = 3;
short b = 17;
int c = 25;
long d = 2;

Welche Werte ergeben die folgenden Ausdrücke? Welche Datentypen haben sie?

  1. b % d + (c - d) * (a + d)
  2. a > b && (c - b) < (a * b) || c % a >= b
  3. a * a + d * d == (a + d) * (a + d)
  4. c * sizeof(a) + a * sizeof(b)

Aufgabe 3: Schaltjahr berechnen

Ein Jahr hat 365 Tage. Jedes vierte Jahr ist jedoch ein Schaltjahr mit 366 Tagen. Jedes hundertste Jahr ist jedoch kein Schaltjahr. Jedes vierhundertste Jahr ist aber doch wieder ein Schaltjahr.

Gegeben ist eine Variable year:

int year = ...;

Schreibe einen Ausdruck, der anhand von year folgenden Wert hat:

  • true, falls year ein Schaltjahr ist
  • false, falls year kein Schaltjahr ist

Tipps:

  • Der Operator % gibt des Rest einer Division zurück. Ist dieser Rest 0, lässt sich die Zahl restlos teilen.
  • Du kannst mit folgenden Werten testen:
    • Schaltjahre: 1904, 1996, 2000, 2004, 2024
    • keine Schaltjahre: 1900, 1997, 2001, 2025

Aufgabe 4: Operatorenpräzedenz

In der Mathematik gilt die Regel “Punkt vor Strich”, d.h. die Operatoren Multiplikationen und Division binden stärker als Addition und Subtraktion. Der Ausdruck (a * b) + (c / d) könnte also auch ohne Klammern folgendermassen gechrieben werden: a * b + c / d ohne dessen Wert zu verändern.

In der Programmiersprache C ist die Operatorenpräzedenz ebenfalls geregelt. Neben “Punkt vor Strich” gilt beispielsweise auch “Und vor Oder”. Das Wikibook zur Programmiersprache C hat eine Liste der Operatoren nach Priorität. Je höher ein Operator in dieser Liste auftaucht, desto stärker bindet er seine Operanden.

Erstelle eine eigene Liste mit Operatorenpräzedenzen, notiere aber nur die Operatoren, die wir im Unterricht angeschaut haben.