Klammersetzung bei Division



  • Hallo zusammen,

    mir ist gestern aufgefallen das wenn ich zwei Integer dividiere und in Klammern setze das Ergebnis 0 ist, ohne Klammern geht es.
    Woran liegt das?

    printf("%2.2f -- %2.2f\n",(float)(360/1000),(float)360/1000);
    

    Ausgabe:

    0.00 -- 0.36
    

    Probiert habe ich es mit GCC 4.7.1 64bit unter windows und gcc version 4.6.3 unter Debian (32bit)

    Ps.: Als Lösung reicht es aus aus den beiden Integern floats (360.0 und 1000.0) zu machen, mich interessiert nur was die Klammern bewirken

    Gruß,
    littleC


  • Mod

    Wozu hast du denn den Cast da? Irgendwo abgeschrieben? Denn wenn du wüsstest, wozu der da ist, dann ist die Antwort doch klar: Im Fall (float)360/1000 wirkt der Cast zuerst und du teilst den resultierende float 360f durch 1000f* und bekommst 0.36f. Im Fall (float)(360/1000) wird zuerst der Ausdruck in den Klammern ausgewertet, der 0 ergibt (Ganzzahldivision. Wie viele mal passt 1000 ganz in 360?), darauf wird dann der Cast angewandt, man bekommt 0f. Beide Ergebnisse werden dann jeweils vor der Ausgabe noch zu double konvertiert, was dann aber auch nichts mehr ändert.

    Als Lösung reicht es aus aus den beiden Integern floats (360.0 und 1000.0) zu machen

    360.0 und 1000.0 sind übrigens vom Typ double, nicht float.

    *: Die 1000 (ein Integer) wird hier automatisch zu float konvertiert, da der andere Operand vom Typ float ist. Die arithmetischen Operatoren arbeiten aber nur mit identischen Datentypen auf beiden Seiten und float gilt als Typ mit der höheren Priorität als int.



  • Okay, das macht natürlich Sinn.
    Danke für die Erklärung.


Anmelden zum Antworten