Frage zu double (im Makro)



  • Hallo,
    wenn ich beispielsweise folgendes Makro schreibe:

    #define P3(a) ((a) * (a) * (a))
    

    Ist der Typ der Zahl, die zurückgegeben wird, immer double?

    Wenn ich das schreibe:

    double r, oflaeche, vol;
    cout << "Geben Sie den Radius der Kugel ein:";
    cin >> r;
    
    oflaeche=4 * PI * P2(r);
    vol = 4.0/3.0 * PI * P3(r); //Fehler, wenn ich 4/4 schreibe
    

    Warum muss ich 4.0 und 3.0 schreiben? Ich komme aus der Welt von Borland und da ist das nicht so. 4 ist doch 4.0.

    Vielen Dank
    lg, freakC++



  • freakC++ schrieb:

    4 ist doch 4.0.

    Nö.
    4 ist ein int.
    4/3==1
    int/int==int



  • aber ich habe doch als double deklariert...



  • freakC++ schrieb:

    Ist der Typ der Zahl, die zurückgegeben wird, immer double?

    Es ist nichtmal gesagt, dass es überhaupt eine Zahl ist. Makros sind reine Textersetzung. Wenn es also irgendein Typ ist, der einen operator* überladen hat, dann könnte da irgendwas rauskommen, je nachdem wie der operator deklariert ist. Im Fall von 4/4 handelt es sich um ints, und da gibt int * int * int = int.

    Mach statt des Makros einfach eine Templatefunktion, die ist typsicher.



  • freakC++ schrieb:

    aber ich habe doch als double deklariert...

    Nö.
    Du berechnest erst 4/3 und das ist 1. Dann erst weist Du die 1 einem double zu.

    vol = 4/3 * PI * P3(r); //fehler

    vol = 4 * PI * P3(r) / 3 ; //oh, geht!

    weil 4 / 3 -> int

    aber 4 * PI -> double


Anmelden zum Antworten