Namespaces
Variants

As-if rule

From cppreference.net

Erlaubt jegliche und alle Code-Transformationen, die das beobachtbare Verhalten des Programms nicht ändern.

Erklärung

Dem C-Compiler ist es erlaubt, beliebige Änderungen am Programm vorzunehmen, solange Folgendes wahr bleibt:

1) An jedem Sequenzpunkt sind die Werte aller volatile -Objekte stabil (vorherige Auswertungen sind abgeschlossen, neue Auswertungen noch nicht begonnen).
(bis C11)
1) Zugriffe (Lese- und Schreiboperationen) auf volatile -Objekte erfolgen strikt gemäß der Semantik der Ausdrücke, in denen sie vorkommen. Insbesondere werden sie nicht neu angeordnet in Bezug auf andere volatile-Zugriffe im selben Thread.
(seit C11)
2) Beim Programmende entsprechen die in Dateien geschriebenen Daten exakt denen, die bei Ausführung des Programms gemäß seinem geschriebenen Code entstanden wären.
3) Aufforderungstext, der an interaktive Geräte gesendet wird, wird angezeigt, bevor das Programm auf Eingaben wartet.
4) Wenn das Pragma #pragma STDC FENV_ACCESS unterstützt wird und auf ON gesetzt ist, werden die Änderungen an der Gleitkommaumgebung (Gleitkomma-Ausnahmen und Rundungsmodi) garantiert von den Gleitkomma-Operatoren und Funktionsaufrufen beachtet, als ob sie wie geschrieben ausgeführt würden, außer dass
  • das Ergebnis jedes Gleitkommaausdrucks außer Cast und Zuweisung den Wertebereich und die Genauigkeit eines Gleitkommatyps haben kann, der sich vom Typ des Ausdrucks unterscheidet (siehe FLT_EVAL_METHOD ),
  • ungeachtet des oben Gesagten können Zwischenergebnisse jedes Gleitkommaausdrucks so berechnet werden, als ob sie mit unendlichem Wertebereich und unendlicher Genauigkeit berechnet würden (es sei denn, #pragma STDC FP_CONTRACT ist auf OFF gesetzt).
(seit C99)

Hinweise

Siehe auch

C++ Dokumentation für as-if rule