Compiler
Welcher Rückgabewert und welcher verbleibende Code der obigen Funktion ist richtig, wenn Konstantenpropagierung, Constant Folding und Entfernung von totem Code gründlich angewendet werden?
int h(void) {
int a = 5;
int b = a * 3;
int c = b - a;
if (c > 100) return 0;
return c * 2;
}
- ASie gibt stets 20 zurück, und die Prüfung der if-Anweisung entfällt
- BSie gibt stets 0 zurück, und return c * 2 entfällt
- CAlle Berechnungen bleiben erhalten, und zur Laufzeit wird 20 oder 0 zurückgegeben
Antwort und Erläuterung anzeigen
Antwort: A. Sie gibt stets 20 zurück, und die Prüfung der if-Anweisung entfällt
Durch Propagieren von a = 5 lässt sich b = 5 * 3 = 15 und c = 15 − 5 = 10 zusammenfassen. Die Bedingung c > 100 ist dann 10 > 100 und somit stets falsch, sodass der Zweig return 0 nie ausgeführt wird und als toter Code entfernt wird. Das verbleibende return c * 2 ergibt 10 × 2 = 20, und die Funktion besteht nur noch aus return 20;. Da die Bedingung stets falsch ist, wird nie 0 zurückgegeben, und zur Laufzeit sind weder Berechnung noch Prüfung nötig.