C-Lerner wrote:
Gefehlt. Wie kommst Du auf *dort* ?
Bei
fkt_moechte_pint( &(int(dbl)) );
würde der Wert der Variable dbl auf den Parameterstack der Funktion int (floor wäre ja überflüssig) gepackt, der Rückgabewert von int darf dann ebenfals auf den Stack und genau diese Adresse darf der Compiler dann an fkt_moechte_pint weiterreichen.
Der Compiler soll deiner Meinung nach also Annahmen darüber machen, was die Funktion mit der Adresse tun möchte. Vielleicht möchte die Funktion ja Pointerarithmetik machen, oder erwartet ein Array (das ja auch als Pointer übergeben wird). Dann muss der Compiler *sehr viel mehr* über die Funktion wissen als ihren Prototyp. So oder so, das ist mehr als eine simple Typwandlung.
Ist das von einem Compiler zu viel verlangt, x = a + b * c schafft er doch auch.
(Selbst wenn es int(&dbl) hieße, bedeutet es dann nicht, dass dbl verändert würde.)
Es ist eben die Abartigkeit von C, Typumwandlungen nicht als Funktion zu sehen. Warum, konnte mir noch niemand erklären.
Weil Typumwandlungen, die die binäre Repräsentation eines Wertes ändern, kein so wesentliches Feature von C sind. In C ist es nur eine Bequemlichkeit, dass der Compiler automatisch Code erzeugt, der floats, ints etc. gemischt in Ausdrücken erlaubt. Die Bequemlichkeit hört aber sofort auf, sobald mehr als der aktuelle Ausdruck im Spiel ist, und das ist beim Umgang mit gepointerten Werten halt schnell der Fall.
Wenn du sowas haben willst, musst du C++ nehmen, oder besser gleich Java. C ist gebastelt worden, um systemnahe Programme nicht in Assembler basteln zu müssen. Alle Semantiken von C sind im Prinzip Semantiken von Assembler. Wenn du C meistern willst musst du dich damit anfreunden.
Dazu eine berühmte Zeile: "The C Programming Language -- A language which combines the flexibility of assembly language with the power of assembly language."
Janka