CSprengel hat geschrieben:Auserdem bin ich trotz Deiner eingehenden Erklärung im ICQ
der Meinung, daß man Floads und Longs so mischen können
muß (vielleicht werd ich ja doch noch anders überzeugt).
Lass Dich nicht beirren, CSprengel.
PB ist alles bekannt was es braucht:
PureBasic, als Compiler, entscheidet hier welche Schritte
nötig sind um das Ergebniss Long zu bekommen.
Das Ergebniss -2147483648 ist aber in jedem Falle absolut
falsch.
Egal ob PB 'b' nach Long umwandelt und dann rechnet:
oder ob PB alles nach Float umrechnet und dann rechnet:
Code: Alles auswählen
LONG = ToLong( FLOAT + FLOAT - FLOAT )
c = ToLong( ToFloat(a) + ToFloat(48) - b )
Durch die Regel "von links nach rechts" ist klar das die ersten
beiden Werte LONGs sind, die Subtraktion mit einem Float,
und das Ergebniss Long:
Code: Alles auswählen
Schritt 1:
LONG =: LONG + LONG
temp1 =: a + 48
Schritt 2:
LONG =: LONG - LONG
c =: temp1 - ToLong(b)
Oder auch:
Code: Alles auswählen
Schritt 1:
LONG =: LONG + LONG
temp1 =: a + 48
Schritt 2:
FLOAT =: FLOAT - FLOAT
temp2 =: ToFloat(temp1) - b
Schritt 3:
LONG =: LONG
c =: ToLong(temp2)
Und was ist der Unterschied zwischen
und
??
Es gibt keinen Unterschied, da eh beides links nach rechts
gerechnet wird.
Vielleicht kann Dir das DarkDragon mal noch ein bissl näher
erklären.
Passend ein Zitat aus "Modern Compiler Design", Seite 29:
1.5 Properties of a good compiler
The foremost property of a good compiler is of course that
it generates correct code. A compiler that occasionally generates
incorrect code is useless; a compiler that generates incorrect
code once a year may seem useful but is dangerous.