Forum: Mikrocontroller und Digitale Elektronik konstanter Wert - Wer rechnet hier ?


von SAM (Gast)


Lesenswert?

Hi,

folgendes:

if ( temp < (1234/232)) mach_was();


wird die Zahl von 5 vom Präprozessor ausgerechnet ?

Also steht da quasi dann da:

if ( temp < 5) mach_was();



würde mich freuen, wenn das jemand mir sagen könnte

Gruß

von Εrnst B. (ernst)


Lesenswert?

Das kann dir am besten dein Kompiler sagen, einfach den erzeugten 
ASM-Code anschauen.

Und ja, die üblichen Kompiler machen das, zumindest wenn die Optimierung 
eingeschaltet ist.

Der Präprozessor rechnet an der Stelle aber nie.

von Michael G. (linuxgeek) Benutzerseite


Lesenswert?

SAM wrote:

> if ( temp < (1234/232)) mach_was();
>
>
> wird die Zahl von 5 vom Präprozessor ausgerechnet ?

Der preprocessor macht hier garnichts, aber ein optimierender Compiler 
wird die ueberfluessige Division durch eine Konstante ersetzen.

von yalu (Gast)


Lesenswert?

> wird die Zahl von 5 vom Präprozessor ausgerechnet ?

Es wird zur Compilezeit ausgerechnet, aber nicht vom Präprozessor,
sondern vom Compiler. Und das ist immer so, unabhängig vom verwendeten
Compiler und der eingestellten Optimierungsstufe.

von Stefan Salewski (Gast)


Lesenswert?

>Und das ist immer so,

Eine etwas gewagte Aussage -- könnte es irgendwo auf der Welt nicht doch 
einen extrem schlecht programmierten C-Compiler geben? Na ja, 
wahrscheinlich nicht.

von yalu (Gast)


Lesenswert?

>> Und das ist immer so,
>
> Eine etwas gewagte Aussage -- könnte es irgendwo auf der Welt nicht
> doch einen extrem schlecht programmierten C-Compiler geben?

Stimmt, die war zu gewagt, wie ich gerade festgestellt habe. Ich wollte
erst antworten, dass der Standard die Auswertung konstanter Ausdrücke
vorschreibt, und dass jeder Compiler, der dies nicht tut, deswegen kein
C-Compiler ist.

Das stimmt so aber nicht: Laut Standard müssen zwar bestimmte Ausdrücke
(bspw. die Größenangabe in statischen Array-Definitionen) konstant sein,
damit der Compiler durch sofortige Auswertung dieser Ausdrücke Dinge zur
Compile-Zeit organisieren kann, die zur Laufzeit nur mit viel Aufwand zu
realisieren wären. Das bedeutet aber natürlich nicht, dass konstante
Ausdrücke in anderen Kontexten, bspw. in Zuweisungen, ebenfalls zur
Compile-Zeit berechnet werden müssen.

Da der Compiler aber für die im Standard aufgeführten Fälle konstante
Ausdrücke sowieso erkennen und berechnen können muss, kostet es den
Compiler-Entwickler praktisch keinen zusätzlichen Aufwand (eher im
Gegenteil), dieses Feature auf Ausdrücke in allen Kontexten
anzuwenden.

Insofern würde ich davon ausgehen, dass auch ohne entsprechende
Vorschrift jeder C-Compiler die 1234/232 im obigen Beispiel schon beim
Kompilieren berechnet, und meine Aussage war vielleicht doch nicht ganz 
so gewagt ;-)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.