Diskussion:Promotion (Typumwandlung)
Fehlt da evtl. was?
Im Artikel steht nur was von char → short → int. Aber sind denn int → long und long → long long keine Promotion? Das geht doch ebenfalls werterhaltend? --Wutzofant (grunz) 17:32, 28. Jan. 2011 (CET)
- Es sind ebenfalls werterhaltende Typumwandlungen, aber keine Promotionen. Mal wieder Implikation mit Äquivalenz verwechselt? ;-) --RokerHRO 17:41, 29. Jan. 2011 (CET)
- Nö, ich formuliere es mal etwas provokanter: Wenn int → long und long → long long keine Promotion darstellt (was ich gerne glaube), dann ist die angegebene Definition unvollständig, zumindest aber völlig unverständlich/missverständlich/irreführend. Und wenn sowas schon ein Informatiker sagt, was meint dann erst WP:OMA... ;-) --Wutzofant (grunz) 03:22, 30. Jan. 2011 (CET)
- Ich weiß nicht, was daran missverständlich sein soll. Man kann auch schreiben:
- „[…] folgende Typumwandlungen – die im Übrigen stets werterhaltend sind, wohingegen nicht alle werterhaltenden Typumwandlungen Promotionen sind – […]“
- aber das ist nur länger und sagt exakt das gleiche aus.
- Anderes Beispiel: Wenn man schreibt: „folgende Bergsteiger, die alle aus der Schweiz kommen, haben den K2 bestiegen:“ gilt ja auch nicht die Umkehrung, dass alle Schweizer Bergsteiger den K2 bestiegen haben, oder dass alle K2-Besteiger aus der Schweiz kommen.
- Es ist meines Wissens auch keine Grundvoraussetzung, dass Promotionen stets werterhaltend sein müssen. In C sind sie es, wie es in anderen Programmiersprachen aussieht, weiß ich nicht.
- --RokerHRO 09:22, 30. Jan. 2011 (CET)
- Ich weiß nicht, was daran missverständlich sein soll. Man kann auch schreiben:
- Momentan liest sich der Artikel für mich so:
- "Promotion ist eine bestimmte Art von automatischen Typumwandlungen, die zur Vereinfachung von arithmetischen Operationen durchgeführt werden. Wir verraten jetzt aber nicht, worin nun die Vereinfachung der arithmetischen Operationen besteht. (Effizientere Ausführung in der CPU, weil klammheimlich eine char-Addition in Wirklichkeit als int-Addition ausgeführt wird? Oder weniger Schreibaufwand für den Programmierer, weil er die Argumente vor der Operation nicht manuell auf den größeren Datentyp umcasten muss? – Da darf der Leser jetzt rätseln.) Außerdem verraten wir jetzt auch nicht, worin sich die Promotion (welche ja nur "eine bestimmte Art von automatischer Typumwandlung" ist) von einer automatischen Typumwandlung, welche keine Promotion ist, unterscheidet.
- Dann kommt das Beispiel mit den Promotionen in C. Es wird erklärt, dass ausschließlich die aufgelisteten automatischen Typumwandlungen als Promotionen bezeichnet werden. Es wird aber nirgendwo ein Hinweis gegeben, aus welchen Gründen z.B. automatische Umwandlungen int → long oder long → long long keine Promotionen sind – wenn man jetzt mal davon absieht, dass man sich aus dem einleitenden Abschnitt und der Information "nur die folgenden automatischen Typumwandlungen sind in C Promotionen, aber andere sind es nicht" natürlich die triviale Erklärung "das ist halt einfach so" implizieren kann. Im Gegenteil: Danach wird von long int und long double geredet, und man fragt sich sofort, wieso eine automatische Aufweitung int → long int (z.B. wenn man ein int mit einem long int addiert) nun keine Promotion sein soll.
- "Das ist halt einfach so" empfinde ich als recht unbefriedigende Erklärung. ;-) --Wutzofant (grunz) 16:15, 30. Jan. 2011 (CET)
- Es ist aber nunmal so, dass eben genau die im Artikel genannten Typumwandlungen in der ISO-C-Sprachnorm "integral type promotion" bzw. "floating point type promotion" genannt werden und keine weiteren. (Ich kann die genaue Stelle im Standard gerne raussuchen.) Da steht kein Grund dahinter. Man kann also nun darüber spekulieren, oder man findet Sekundärliteratur, die die Designentscheidungen der C-Norm bewerten, erklären oder begründen. Auf diese kann man dann verweisen, wenn man Gründe angeben will. Ansonsten beschränken wir uns hier auf das, was die Norm festgelegt hat und werten es nicht weiter. --RokerHRO 17:11, 30. Jan. 2011 (CET)
- Wie gesagt: Dass die Aussage stimmt, habe ich ja gar nicht bezweifelt – ich konnte lediglich nicht verstehen, warum es so ist. Jetzt weiß ich zwar immer noch nicht, was genau nun eine Promotion von anderen automatischen Typumwandlungen unterscheidet, und was entsprechend der technische Grund sein mag, warum die anderen nicht als Promotion bezeichnet werden. Aber super und vielen Dank, dass Du es in der C-Norm nachgeschlagen hast; das kann ruhig als Quellenangabe rein. Tja, da müssen wir wohl bis auf Weiteres die unbefriedigende Erklärung "es ist halt so" im Artikel lassen. Eventuell werd ich das in den nächsten Tagen noch etwas klarer formulieren, wenn mir eine gute Formulierung einfällt. Schönen Abend noch, --Wutzofant (grunz) 20:36, 30. Jan. 2011 (CET)
Die Frage nach dem Warum
Es gibt für C++ das Buch "Design & Evolution of C++", von Bjarne Stroustrup höchst selbst, wo er einige Designentscheidungen von C++ im historischen Kontext erläutert und eben die Gründe nennt, wieso C++ so ist, wie es heute ist. Vielleicht gibt es so ein Buch ja auch von den C-Machern für C? Oder andere zitierwürdige Artikel, wo sie erklären, was sie sich bei diesem oder jenem Sprach-Feature gedacht haben... --RokerHRO 22:00, 30. Jan. 2011 (CET)
Zitat aus der C-Norm
Das habe ich auf die Schnelle gefunden im Kapitel §6.3.1.1.:
- “(2) […] If an
int
can represent all values of the original type, the value is converted to anint
; otherwise, it is converted to anunsigned int
. These are called the integer promotions. All other types are unchanged by the integer promotions. - (3) The integer promotions preserve value including sign. As discussed earlier, whether a “plain”
char
is treated as signed is implementation-defined.”
Vielleicht kann man das ja als Zitat mit einbauen in den Artikel? --RokerHRO 17:33, 30. Jan. 2011 (CET)
Jetzt habe ich nochwas gefunden: Sind beide Operanden vom Typ float
, wird die Berechnung – anders als im Artikel hier geschildert – auch in diesem Datentyp durchgeführt. Dagegen gibt es noch die sogenannte default argument promotion (die bei nicht sepzifizierten Funktionsparametern durchgeführt wird). Dort werden float
-Werte nach double
konvertiert. Zu finden in § 6.5.2.2. (6). --RokerHRO 17:39, 30. Jan. 2011 (CET)
Überladungsauflösung etc.
Ich wollte eigentlich ursprünglich schreiben, dass die C#-Spezifikation "Promotion" gar nicht erwähnt, man also ohne diesen Begriff auskommt, und es sich beim dem ganzen lediglich um einen historischen Unfall mit Mehrfachbenennungsfolge handelt. Dann hab' ich aber nochmal nachgelesen und überlegt. [1], 14.2.6 erwähnt sehr wohl Promotion, aber nur am Rande, als sog. "informative" Subclause.
Und da kann man, denke ich, sehen, wo der Hase im Pfeffer liegt. Mittels benutzerdefinierten impliziten Typumwandlungen und Überladungsauflösung kann man alles promotionsmäßige in der Standardbibliothek (ggf. mit Intrinsics) nachbilden. Aber: In C gibt's halt weder Overloading noch benutzerdefinierte implizite Umwandlungen, im Gegensatz zu C++ und C#. Daher braucht man dort auch den separaten Begriff, andernfalls kommt man bei mehreren Operanden ins Schleudern, da man diesen nicht einfach so auf mehrere voneinander unabhängige implizite Umwandlungen zurückführen kann. --Daniel5Ko 23:57, 30. Jan. 2011 (CET)