Typencast und "Fehler" bei Divisonen
-
Hallo Community
Ich habe ein Problem/Feature, welches mich ganz schön stört. Ichweiß, dass es aus CPP-Sicht logisch ist, aber bei z. B. VB6 ist das anders gehandhabt:
Ich habe folgende Rechnung.
VAR1 = 1 / 2;müsste in VAR1 (ein double-Variable) 0,5 stehen.
Wnn ich aberVAR2 = 1; VAR3 = 2: VAR1 = VAR2 / VAR3;schreibe, dann kommt 0 in VAR1 an, wenn VAR2 und VAR3 int-Variablen sind.
Ich kann natürlich
VAR1 = (double) VAR2 / (double) VAR3;benutzen, aber da muss man ganz schön aufpassen, dass man das nicht irgendwo mal vergisst.
Kann man das irgendwo im VS2005 einstellen, dass er so castet, wie es die ergebnisaufnehmende Variable wünscht, anstatt auf die Ausgangstypen zu casten?
Das wäre schon sehr toll - ich hoffe nur, dass das keine wirklich dumme Frage ist?
schüss, Heiko aus Schwebheim
-
hvsecpp schrieb:
Ich habe folgende Rechnung.
VAR1 = 1 / 2;müsste in VAR1 (ein double-Variable) 0,5 stehen.
Die Annahme ist bereits falsch. 1 und 2 erkennt der COmpiler als Integer, also ist das Eregbnis auch Integer. Der Compiler verhält sich da eindeutig. Wenn Du zwei Integer-Zahlen verrechnest ist das Ergebnis integer.
VAR1 = 1.0f / 2.0f;Da sieht das anders aus. Jetzt hast Du dem Compiler gesagt das er die Zahlen als float behandeln soll, also ist der temporäre Wert auf der rechten Seite (rvalue) auch ein float.
Was Du willst ist keine gute Idee, denn es würde das Verhalten von bestehendem Code verändern. Abhängig von diesem "Flag" würde der gleiche Sourcecode unterschiedliche Ergebnisse erzeugen. Das ist grundsätzlich immer eine scheiß-idee

-
Habe schon befürchtet, dass das ein Feature ist. Verwirrend ist halt, dass das bei z. B. VB anders ist, und wenn man aus der VB-Welt kommt, macht man Annahmen, die in der CPP-Welt genau andersherum sind.
Also komme ich nicht darumherum, alle Berechnungen mit Variablen zu überprüfen auf eben diese Eigenschaft, und alle Variablen manuell als double zu "precasten" (gibt es dieses Wort oder habe ich das gerade erfunden - toll)?
Danke Euch ...
-
Das f hinter den Zahlen kannst du hier auch weglassen. Schon das .0 kennzeichnet sie eindeutig. Außerdem reicht es eine der beiden zahlen zu kennzeichnen um das gewünschte Ergebnis zu erhalten.
Das reicht also auchVAR1 = 1.0 / 2;
-
Braunstein schrieb:
Das f hinter den Zahlen kannst du hier auch weglassen. Schon das .0 kennzeichnet sie eindeutig. Außerdem reicht es eine der beiden zahlen zu kennzeichnen um das gewünschte Ergebnis zu erhalten.
Das reicht also auchVAR1 = 1.0 / 2;jein
1.0 = double
1.0f = float
-
Braunstein schrieb:
Das f hinter den Zahlen kannst du hier auch weglassen. Schon das .0 kennzeichnet sie eindeutig. Außerdem reicht es eine der beiden zahlen zu kennzeichnen um das gewünschte Ergebnis zu erhalten.
Das reicht also auchVAR1 = 1.0 / 2;Der Punkt allein genügt (Ziffern müssen nur auf einer Seite des Punktes stehen, womit ich nicht sagen will, dass das unbedingt schön ist) - beides macht das Suffix f oder F aber nicht überflüssig, denn ohne dieses ist der Typ des Ausdrucks double.
1 / 2; // int 1. / 2; // double 1.f / 2; 1.F / 2; // float 1.l / 2; 1.L / 2; // long double
-
Vielen Dank für Eure vielen Kommentare zu
VAR1 = 1 / 2;Wobei das eigentlich nur veranschlichen sollte, wie ich es von VB6 her denken würde. Nirgend in meinem Code arbeite ich hardcoded Zahlen.
Immer sind Varibalen im Spiel, und oft muss man int-Variablen nehmen, wenn ich z. B. mit Rects arbeite.
Und in der blauäugigen Ansicht, dass int / int automatisch double ist, wenn das Ergebnis ein Bruch ist, habe ich nirgends einen solchen manuellen cast durchgeführt und muss nun wohl oder übel meinen kompletten Code daraufhin untersuchen. btw: wardas bei VS6 auch schon so? Wahrscheinlich schon, oder?
schüss - und Danke nochmal
-
hvsecpp schrieb:
VUnd in der blauäugigen Ansicht, dass int / int automatisch double ist, wenn das Ergebnis ein Bruch ist, habe ich nirgends einen solchen manuellen cast durchgeführt und muss nun wohl oder übel meinen kompletten Code daraufhin untersuchen. btw: wardas bei VS6 auch schon so? Wahrscheinlich schon, oder?
Das war schon immer so. C++ ist ein Typsicheres System.
Zudem erwarte ich auch das wenn ich eine Operation zweier gleicher Datentypen mache, als Ergebnis der gleiche Typ gilt.
cu André
-
Es gibt doch bei VB auch die Unterscheidung "/" für Integer- und "\" für Floatingpoint-Divisionen?

EDIT:
Wenn ich einen Backslash im Nachrichtentext eingebe, erwarte ich aber eigentlich schon, dass auch ein Backslash im Ausgabetext erscheint.
-
camper schrieb:
beides macht das Suffix f oder F aber nicht überflüssig, denn ohne dieses ist der Typ des Ausdrucks double.
Da der OP ja wohl ein double als Ergebnis wollte, war es doch richtig.

-
Braunstein schrieb:
camper schrieb:
beides macht das Suffix f oder F aber nicht überflüssig, denn ohne dieses ist der Typ des Ausdrucks double.
Da der OP ja wohl ein double als Ergebnis wollte, war es doch richtig.

stimmt. Glücklicherweise ist in diesem Fall aber auch das float-Ergebnis exakt.