Basis van programmeren in C

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

int is 32 bits (maximum 2147483647). Wat is de grootste n waarvoor de bovenstaande functie fact(n) de faculteit van n correct en zonder overloop teruggeeft?

  1. A12
  2. B13
  3. C20
Antwoord en toelichting tonen

Antwoord: A. 12

fact is een functie die met recursie zichzelf aanroept als n × fact(n − 1) en 1 teruggeeft als n 1 of kleiner is. 12! = 479001600 is kleiner dan het maximum van int, 2147483647, dus wordt correct berekend, maar 13! = 6227020800 overschrijdt het maximum. Bij fact(13) treedt in de laatste vermenigvuldiging 13 × 479001600 overloop van een integer met teken op, en dat is ongedefinieerd gedrag. Niet-geoptimaliseerde gcc op x86-64 geeft bijvoorbeeld 1932053504 terug, de rest van 6227020800 bij deling door 2³², maar dit resultaat is niet gegarandeerd. Voor grotere n gebruik je bijvoorbeeld de 64-bits long long (tot n = 20).

Dit onderwerp oefenen Naar de onderwerppagina

Meer vragen over Basis van programmeren in C

  1. int is 4 bytes en een pointer is 8 bytes. Als de waarde (het adres) van een pointer p naar int 0x1000 is, wat is dan de waarde van p + 3?
  2. int is 4 bytes en een pointer is 8 bytes. Wat is de uitvoer als het bovenstaande programma wordt uitgevoerd?
  3. int is 4 bytes. Wat is de uitvoer als de bovenstaande code wordt uitgevoerd?
  4. Wat is de uitvoer als de bovenstaande code met een char-array die een string bevat, wordt uitgevoerd?
  5. Na de bovenstaande declaraties wordt een van de statements A „p = t;”, B „*p = 'x';”, C „q = t;” of D „*q = 'x';” geschreven. Welke combinatie geeft compileerfouten?