www.mikrocontroller.net

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


Autor: SAM (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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ß

Autor: Εrnst B✶ (ernst)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Michael G. (linuxgeek) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: yalu (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Stefan Salewski (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: yalu (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ;-)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.