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;
}
  1. AEin Code, bei dem der Vergleichsbefehl unbedingt erhalten bleibt, sodass nur bei Maximalwert von x 0 zurückgegeben wird
  2. BEin Code, der durch einen ersetzt wird, der stets 1 zurückgibt
  3. 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.

Dieses Thema üben Zur Themenseite

Weitere Fragen zu Compiler

  1. Welcher Programmfehler lässt sich bereits zur Kompilierzeit finden?
  2. Was ist der Hauptvorteil der Typprüfung durch den Compiler bei einer Sprache mit statischen Typen?
  3. Was wird häufig verwendet, um die Regeln zur Erkennung von Token in der lexikalischen Analyse auszudrücken?
  4. Welche Grammatikart dient zur Beschreibung der Grammatik vieler Programmiersprachen und bildet die Grundlage der Syntaxanalyse?
  5. Welche Gestalt des abstrakten Syntaxbaums für den Ausdruck 2 + 3 * 4 ist richtig?

Vergleiche zu diesem Thema