Frage zu Programm/ablauf
-
Hallo liebe Community!
Ich bin gerade dabei für meine erste C-Programmierung Klausur zu lernen und dabei auf folgendes Beispiel gestoßen:
#include <stdio.h> #define CELSIUS_ZU_FAHRENHEIT(t) (t * 1.8 + 32) int main() { int mean = 24; float delta = 3.3; printf("Current temp in F: %f\n", CELSIUS_ZU_FAHRENHEIT(mean+delta)); return 0; }
Kann mir bitte jemand erklären was da ganz genau passiert ?
ich weiß nicht genau was das define ... macht
danke im voraus für eure Hilfe !
-
Das ist eine Ersetzungsvorschrift, die vor der eigentlichen Übersetzung vom Präprozessor vorgenommen wird.
CELSIUS_ZU_FAHRENHEIT(mean+delta) wird also ersetzt durch
(mean + delta * 1.8 + 32)(und daran sieht man auch, dass dabei ziemlicher Müll rauskommen kann, wenn man nicht aufpasst.)
-
danke für die Erklärung
-
So ganz versteh ich Bashars Ersetzung nicht
Soll da mean + delta nicht gleich t sein?
((mean + delta) * 1.8 + 32) <= Formel: von Fahrenheit nach Celsius
MfG f.-th.
-
Hab in der falschen Zeile nachgesehen:
nicht -> von Fahrenheit nach Celsius
sondern -> von Celsius nach FahrenheitAber ohne ein wenig zusätzlicher Erklärung ist das bei solchen Aufgaben manchmal schwierig die gefragte Lösung zu finden.
-
f.-th. schrieb:
So ganz versteh ich Bashars Ersetzung nicht
Soll da mean + delta nicht gleich t sein?
((mean + delta) * 1.8 + 32) <= Formel: von Fahrenheit nach Celsius
MfG f.-th.
Nee, der Präprozessor ist dumm (weswegen man ja auch Funktionen verwenden sollte...).
Der setzt einfach stur überall da, wo t steht, das übergeben ein. Und ist das übergebene mean + delta, schreibt der da auch nur mean + delta hin.
Das hier ist ja auch gültig:CELSIUS_ZU_FAHRENHEIT(mean += delta; mean);
Daraus wird dann einfach stur:
mean += delta; mean * 1.8 + 32;
-
((mean + delta) * 1.8 + 32)
gibt es, wenn du bei Aufruf vom Makro Klammern setzt:printf("Current temp in F: %f\n", CELSIUS_ZU_FAHRENHEIT( (mean+delta) )); ^ Klammern ^
oder besser gleich beim define extra Klammern um das Argument:
#define CELSIUS_ZU_FAHRENHEIT(t) ((t) * 1.8 + 32) ^ ^ Klammern