Grundlagen der Programmiersprache C

int fact(int n) {
    if (n <= 1)
        return 1;
    return n * fact(n - 1);
}

int habe 32 Bit (Maximalwert 2147483647). Was ist das größte n, für das die obige Funktion fact(n) die Fakultät von n ohne Überlauf korrekt zurückgibt?

  1. A12
  2. B13
  3. C20
Antwort und Erläuterung anzeigen

Antwort: A. 12

fact ruft sich wie in n × fact(n − 1) selbst auf und gibt 1 zurück, sobald n höchstens 1 ist; eine solche Funktion arbeitet mit Rekursion. 12! = 479001600 ist kleiner als der int-Maximalwert 2147483647 und wird korrekt berechnet, 13! = 6227020800 dagegen überschreitet den Maximalwert. In fact(13) tritt bei der letzten Multiplikation 13 × 479001600 ein Überlauf einer vorzeichenbehafteten Ganzzahl auf, und das ist undefiniertes Verhalten. Mit gcc auf x86-64 ohne Optimierung wird beispielsweise 1932053504 zurückgegeben, der Rest von 6227020800 geteilt durch 2³², doch dieses Ergebnis ist nicht garantiert. Für größere n verwendet man etwa das 64-Bit-long long (bis n = 20).

Dieses Thema üben Zur Themenseite

Weitere Fragen zu Grundlagen der Programmiersprache C

  1. int habe 4 Byte und ein Zeiger 8 Byte. Ein Zeiger p auf int hat den Wert (die Adresse) 0x1000. Welchen Wert hat p + 3?
  2. int habe 4 Byte und ein Zeiger 8 Byte. Welche Ausgabe erzeugt das obige Programm bei der Ausführung?
  3. int habe 4 Byte. Welche Ausgabe erzeugt der obige Code bei der Ausführung?
  4. Welche Ausgabe erzeugt der obige Code mit einem char-Array, das eine Zeichenkette enthält, bei der Ausführung?
  5. Nach den obigen Deklarationen wird eine der Anweisungen A „p = t;“, B „*p = 'x';“, C „q = t;“ oder D „*q = 'x';“ geschrieben. Welche Kombination führt zu Kompilierfehlern?