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ß
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.
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.
> 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.
>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.
>> 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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.