Thiemos Archiv
- Wednesday, 2002-10-16 16:22
- Ich lerne C++ gerade kennen und (ein bischen) hassen.#include <stdio.h>Kann mir mal einer erklären, was
void main() {
double a = 0.5;
a = 1 / 2 * a;
printf("%f\n", a); //Ergebnis: 0.000000
}MicrosoftC++ sich dabei gedacht hat? - 2002-10-17 14:29
- das hat nix mit Microsoft zu tun! Das ist C++.
- Sl@jaR
- 2002-10-19 17:57
- Da passiert folgendes: 1 ist vom Typ Integer. 2 ist vom Typ Integer. Jetzt ist (Links-nach-rechts-Abarbeitung) 1 / 2 vom Typ Integer und somit 1 geteilt durch 2 = 0 (Rest 1). Als nächstes kommt 0 als Integer mal 0.5 vom Typ Double => Implizite Konversion von 0 zu Double, 0.0 * 0.5 = 0.0 Das Ergebnis ist vom Typ Double und kann nun ohne Konversion in a gespeichert werden. Ist auch logisch, schließlich ist C++ für Compiler gemacht - und dort ist eine dynamische Typkonversion zur Laufzeit aus Performancegründen unerwünscht (Code mal sowas in Assembler). Irritiert natürlich, wenn man von Skriptsprachen mit nahezu derselben Syntax ein anderes Verhalten gewohnt ist.
- T$
- 2002-10-19 17:59
- Und automatische Zeilenumbrüche wären schön...
- T§
- 2002-10-20 20:35
- Man könnte (!) allerdings auch so argumentieren: a) Am weitesten links steht a, welches vom Typ Double ist. Demnach muß das Ergebnis von eben diesem Typ sein und jegliche Umwandlung von/zu Integer wäre Verschwendung. b) Der Kompiler muß aufgrund der Operatorrangfolge sowieso mehrmals über den Ausdruck laufen. Dabei sollte er problemlos erkennen können, dass 1/2 ein Bruch ist, der sich zu 0.5 vereinfachen läßt. Aber es ist natürlich Käse, sich überhaupt darüber aufzuregen.
- Thiemo
- 2002-10-21 18:55
- "It´s not a bug, it´s a Feature" halt ;)
- T$h
Kommentare zu diesem Beitrag können per E-Mail an den Autor gesandt werden.