web-dev-qa-db-fra.com

Y a-t-il une différence entre le casting et la conversion de types dans des langages de programmation impérative?

La question est venue dans une Discussion à Stackoverflow.

Y a-t-il une distinction propre entre les deux concepts . Cast et Convert (concernant Le type d'objet), ou ces deux mots décrivant-ils exactement la même chose? Que diriez-vous des langues autres que c ++, Python et java? [~ # ~] Edit [~ # ~] : Et si les types en question sont des types primitifs, comme int à float?

8
krlmlr

Différentes langues définissent les mots "couler" et "convertir" différemment; Je ne pense pas que la question est significative autre que dans une langue particulière.

Dans C, par exemple, le terme "coulé" ne fait fonctionner correctement qu'à un opérateur de distribution explicite, constitué d'un nom de type entre parenthèses précédant l'expression à convertir. Une "conversion" convertit une valeur d'un type à une valeur d'un autre type; Certains Les conversions sont mises en œuvre en ré-interprétant les bits qui composent la représentation, mais il est défini comme une conversion de valeur à valeur. (Oui, c'est vrai même pour les conversions de pointeur; il est possible que différents types de pointeurs ont des représentations différentes.)

Notez qu'il n'y a pas de "casting implicite" dans C.

Certaines conversions sont explicites, spécifiées par un opérateur de distribution. D'autres sont implicites et sont appliquées dans certains cas lorsqu'une expression d'un type est utilisée dans un contexte nécessitant une expression d'un type différent. La conversion effectuée est exactement la même dans les deux cas.

Par example:

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++ est similaire; Il a les mêmes moulages et conversions que c, et ajoute une notation fonctionnelle équivalente à une expression de coulée de style C, plus 4 mots-clés supplémentaires: const_cast, dynamic_cast, reinterpret_cast, et static_cast.

3
Keith Thompson

Lors de la coulée, vous lisez l'instance d'une classe comme si c'était l'instance d'une autre classe. Il pourrait être applicable pour cette paire de cours ou non. Pas de travail d'exécution à l'exception de la vérification. Souvent, l'incompatibilité possible pourrait être prise sur le stade de la compilation.

Lors de la conversion, vous recombinez ou racontez des champs d'une instance d'une classe dans une instance d'une autre classe. S'il y a une fonction pour cela, cela pourrait être applicable ou non pour cette instance même. Tout le travail est effectué pendant l'exécution. Aucune erreur n'a pu être vérifiée lors de la compilation.

1
Gangnus