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 Fahrenheit

    Aber 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
    

Anmelden zum Antworten