Compiler
In C ist der Überlauf von vorzeichenbehafteten Ganzzahlen undefiniertes Verhalten. Welcher Code kann ein optimierender Compiler unter dieser Voraussetzung für die obige Funktion erzeugen?
int f(int x) {
return x + 1 > x;
}
- AEin Code, bei dem der Vergleichsbefehl unbedingt erhalten bleibt, sodass nur bei Maximalwert von x 0 zurückgegeben wird
- BEin Code, der durch einen ersetzt wird, der stets 1 zurückgibt
- CWegen des undefinierten Verhaltens wird die Kompilierung abgebrochen und ein Fehler ausgegeben
Antwort und Erläuterung anzeigen
Antwort: B. Ein Code, der durch einen ersetzt wird, der stets 1 zurückgibt
Da der Überlauf vorzeichenbehafteter Ganzzahlen undefiniertes Verhalten ist, darf der Compiler annehmen, dass in korrekten Programmen kein Überlauf auftritt. Unter dieser Annahme ist x + 1 stets größer als x, sodass der Vergleich entfallen und Code erzeugt werden kann, der stets 1 zurückgibt. Code, der bei Maximalwert von x den Wert 0 erwartet, kann durch diese Optimierung nicht wie erwartet funktionieren. Undefiniertes Verhalten wird meist zur Kompilierzeit nicht erkannt und führt nicht zu einem Fehler.