Gibt es einen Unterschied zwischen Casting- und Konvertierungstypen in imperativen Programmiersprachen?

8

Die Frage wurde in einer Diskussion bei StackOverflow gestellt.

Gibt es eine klare Unterscheidung zwischen den beiden Konzepten Cast und Convert (in Bezug auf den Typ eines Objekts), oder beschreiben diese beiden Wörter genau dasselbe? Wie wäre es mit anderen Sprachen als C ++, Python und Java? EDIT : Was passiert , wenn die Typen in Frage sind primitive Typen, wie intzu float?

krlmlr
quelle

Antworten:

5

Theoretisch sind die beiden Konzepte sehr unterschiedlich:

Type Casting bezeichnet einen Typ zum Austauschen von (grob gesagt, eine Objektstruktur) , während für einen anderen Typ Konvertierung zu übersetzen von Werten bezieht (grob gesagt, die Inhalte des Objekts), so dass sie als zu einer neuen Art interpretiert werden kann. Theoretisch vermischen sie sich nie .

Das sei gesagt, praktisch gesprochen , während Sie können eine ohne andere haben, ist es fast immer eine schlechte Idee. Es ist selten sinnvoll, die Wahrnehmung der Objektstruktur zu ändern, ohne auch deren Inhalt zu ändern. Praktisch sind sie fast immer gleich

Blaubeerfelder
quelle
3
Mit einer schwach typisierten Sprache wie C macht dies noch mehr Spaß. Sie können einfach einen Speicherabschnitt als einen anderen Typ bezeichnen!
Sheldon Warkentin
So werden die Begriffe "Besetzung" und "Konvertierung" in C nicht verwendet. Siehe meine Antwort.
Keith Thompson
Ich habe die Frage bearbeitet. Hast du irgendwelche Gedanken dazu? Vielen Dank!
krlmlr
Die Antwort ändert sich für Grundelemente nicht.
blueberryfields
"Es ist selten sinnvoll, die Wahrnehmung der Objektstruktur zu ändern, ohne auch deren Inhalt zu ändern." Ist das nicht der springende Punkt bei Subtypisierung und Polymorphismus? einen Verweis auf eine AbstractSpriteWeile halten und überhaupt keine Ahnung haben, dass es tatsächlich eine ist BigGreenTreeSprite?
Sara
3

Verschiedene Sprachen definieren die Wörter "cast" und "convert" unterschiedlich. Ich denke nicht, dass die Frage anders aussagekräftig ist als in Bezug auf eine bestimmte Sprache.

In C bezieht sich der Begriff "Umwandlung" beispielsweise nur auf einen expliziten Umwandlungsoperator, der aus einem Typnamen in Klammern vor dem zu konvertierenden Ausdruck besteht. Eine "Konvertierung" konvertiert einen Wert eines Typs in einen Wert eines anderen Typs. Einige Konvertierungen werden implementiert, indem die Bits, aus denen die Darstellung besteht, neu interpretiert werden. Sie werden jedoch als Wert-zu-Wert-Konvertierung definiert. (Ja, das gilt auch für Zeigerkonvertierungen. Unterschiedliche Zeigertypen können unterschiedliche Darstellungen haben.)

Beachten Sie, dass es in C keine "implizite Besetzung" gibt.

Einige Konvertierungen sind explizit und werden von einem Cast-Operator angegeben. Andere sind implizit und werden in bestimmten Fällen angewendet, wenn ein Ausdruck eines Typs in einem Kontext verwendet wird, der einen Ausdruck eines anderen Typs benötigt. Die durchgeführte Konvertierung ist in beiden Fällen genau gleich.

Zum Beispiel:

double x = 1.23;
int y = (int)x;  /* A cast, or explicit conversion, setting y to 1 */
int z = x;       /* An implicit conversion, setting z to 1. */

C ++ ist ähnlich; Es hat die gleichen Abgüsse und Umrüstungen wie C, und es fügt eine funktionale Notation entspricht einem gegossenen Ausdruck C-Stil, plus 4 spezifischere Stichwort: const_cast, dynamic_cast, reinterpret_cast, und static_cast.

Keith Thompson
quelle
Bin ich die einzige Person, die Casting nicht mag, um Gleitkommazahlen in ganzzahlige Typen oder größere ganzzahlige Typen in kleinere umzuwandeln? Meiner Meinung nach sollte Casting für Situationen geeignet sein, in denen ein Sprachdesigner nur ein plausibles Verhalten auswählen konnte, und andere Konvertierungsmethoden sollten verwendet werden, wenn unterschiedliche Verhaltensweisen in unterschiedlichen Kontexten sinnvoll wären. Man könnte zum Beispiel argumentieren , dass eine Sprache machen sollte (int)1.5-2*(int)(-1.5)3 Ertrag, 4, 5 oder 6, aber wenn (int)hatte mit ersetzt worden truncInt, roundPeriodicInt, floorInt, oder roundEvenInt, ...
supercat
... es würde keine Mehrdeutigkeit geben. Ebenso gibt es Fälle, in denen Zahlen erwartet werden, die nicht zum kleineren Typ passen und umbrochen werden sollten, wenn ein längerer Ganzzahltyp in einen kürzeren umgewandelt wird, und es gibt Fälle, in denen solche Zahlen unerwartet sind und eine Ausnahme auslösen sollten. Verschiedene Sprachen haben unterschiedliche Verhaltensweisen bei solchen Darstellern, daher ist es kaum ein Selbstbeweis, welches Verhalten eine Besetzung haben sollte. Sofern eine Sprache nicht sowohl umhüllende als auch nicht umhüllende Ganzzahltypen aufweist (ein gutes Designkonzept, IMHO, obwohl ich keine kenne), erscheint es hilfreich, anzugeben, ob ein Umbruch erwartet wird.
Supercat
@supercat: Zumindest in C gibt eine Umwandlung immer dieselbe Art von Konvertierung an, die implizit durch eine Zuweisung zu einem Objekt desselben Typs ausgeführt wird - wenn es sich um eine der Konvertierungen handelt (meistens zwischen arithmetischen Typen) implizit gemacht. Andere Arten von Konvertierungen, z. B. die Angabe der Art der Rundung / Kürzung für Gleitkommazahlen, können über Funktionsaufrufe erfolgen.
Keith Thompson
Natürlich können Funktionen verwendet werden; mein Punkt ist , dass ich denke , Funktionen oder Mitglieder sollten als angesehen werden , die richtigen Mittel zur Durchführung Umwandlungen , deren Ergebnisse stellen möglicherweise nicht die ursprünglichen Werte. Ich weiß, dass C implizite Konvertierungen von Float in Integer zulässt, und die Kompatibilität schreibt vor, dass dies wahrscheinlich immer erforderlich sein wird, aber das bedeutet nicht, dass dies der Fall sein sollte. Pascal erfordert einen Anruf Roundoder Trunc--IMHO ein viel saubereres Design.
Supercat
1

Während des Castings lesen Sie die Instanz einer Klasse so, als wäre es die Instanz einer anderen Klasse. Es könnte für dieses Klassenpaar anwendbar sein oder nicht. Keine Laufzeitarbeit außer Überprüfung. Oft kann die mögliche Inkompatibilität beim Kompilieren festgestellt werden.

Während der Konvertierung kombinieren Sie Felder einer Instanz einer Klasse neu oder zählen sie in eine Instanz einer anderen Klasse um. Wenn es eine Funktion dafür gibt, kann sie für genau diese Instanz anwendbar sein oder nicht. Die gesamte Arbeit wird zur Laufzeit erledigt. Beim Kompilieren konnte kein Fehler überprüft werden.

Gangnus
quelle
Das klingt sprachspezifisch. Auf welche Sprache beziehen Sie sich?
Keith Thompson
Java, C ++, C #, Pascal / Delphi.
Gangnus
C ++ verwendet die Begriffe "Besetzung" und "Konvertierung" auf die gleiche Weise wie der C-Standard, wobei einige spezielle Besetzungsschlüsselwörter hinzugefügt werden. siehe meine Antwort.
Keith Thompson