Compilers

Welke uitspraak over de teruggegeven waarde en de resterende code van de bovenstaande functie is juist wanneer constant propagation, constant folding en verwijdering van dode code voldoende zijn toegepast?

int h(void) {
    int a = 5;
    int b = a * 3;
    int c = b - a;
    if (c > 100) return 0;
    return c * 2;
}
  1. AHij geeft altijd 20 terug en de test van het if-statement wordt verwijderd
  2. BHij geeft altijd 0 terug en return c * 2 wordt verwijderd
  3. CAlle berekeningen blijven staan en bij uitvoering wordt 20 of 0 teruggegeven
Antwoord en toelichting tonen

Antwoord: A. Hij geeft altijd 20 terug en de test van het if-statement wordt verwijderd

Propagatie van a = 5 geeft b = 5 * 3 = 15 en c = 15 − 5 = 10. Daardoor is de voorwaarde c > 100, dus 10 > 100, altijd onwaar, zodat de tak met return 0 nooit wordt uitgevoerd en als dode code wordt verwijderd. Het resterende return c * 2 is 10 × 2 = 20, en de functie wordt alleen return 20;. Omdat de voorwaarde altijd onwaar is, wordt nooit 0 teruggegeven en hoeft tijdens de uitvoering niet te worden berekend of getest.

Dit onderwerp oefenen Naar de onderwerppagina

Meer vragen over Compilers

  1. Welke uitspraak over de rol van lexicale analyse in een compiler is juist?
  2. Wat doet de parsing (syntactische analyse) van een compiler?
  3. Welke fout wordt het best gevonden door de semantische analyse van een compiler?
  4. Welke uitspraak over een abstracte syntaxisboom (AST) is juist?
  5. Wat is het belangrijkste voordeel van het gebruik in een compiler van een tussenrepresentatie (IR) die niet van de brontaal en niet van de CPU afhangt?

Vergelijkingen bij dit onderwerp