¿Hay alguna diferencia entre convertir y convertir tipos en lenguajes de programación imperativos?

8

La pregunta surgió en una discusión en StackOverflow.

¿Existe una distinción clara entre los dos conceptos fundido y convertido (en relación con el tipo de un objeto), o son estas dos palabras que describen exactamente lo mismo? ¿Qué tal otros lenguajes que no sean C ++, Python y Java? EDITAR : ¿Qué pasa si los tipos en cuestión son los tipos primitivos, como inta float?

krlmlr
fuente

Respuestas:

5

Hablando teóricamente , los dos conceptos son muy diferentes:

La conversión de tipos se refiere al intercambio de un tipo (en términos generales, una estructura de objeto) por otro, mientras que la conversión de tipos se refiere a la traducción de valores (en términos generales, el contenido del objeto), de modo que puedan interpretarse como pertenecientes a un nuevo tipo. Teóricamente, nunca se mezclan .

Dicho esto, en términos prácticos , mientras que puede tener una sin la otra, que es, casi siempre, una mala idea. Rara vez tiene sentido cambiar su percepción de la estructura de un objeto, sin alterar también su contenido. Prácticamente, casi siempre son lo mismo.

blueberryfields
fuente
3
Esto se vuelve aún más divertido con un lenguaje débilmente escrito, como C, ¡simplemente puede referirse a una sección de memoria como un tipo diferente!
Sheldon Warkentin
Así no se usan los términos "cast" y "conversión" en C. Vea mi respuesta.
Keith Thompson
He editado la pregunta. ¿Tienes alguna idea al respecto? ¡Gracias!
krlmlr
La respuesta no cambia para los primitivos.
blueberryfields
"Rara vez tiene sentido cambiar su percepción de la estructura de un objeto, sin alterar también su contenido". ¿No es este el punto de subtipo y polimorfismo? manteniendo una referencia a un AbstractSpritemomento sin tener idea de que en realidad es un BigGreenTreeSprite?
sara
3

Diferentes idiomas definen las palabras "emitir" y "convertir" de manera diferente; No creo que la pregunta tenga sentido más que en referencia a un idioma en particular.

En C, por ejemplo, el término "conversión" se refiere correctamente solo a un operador de conversión explícito, que consiste en un nombre de tipo entre paréntesis que precede a la expresión a convertir. Una "conversión" convierte un valor de un tipo en un valor de otro tipo; Algunas conversiones se implementan reinterpretando los bits que componen la representación, pero se define como una conversión de valor a valor. (Sí, eso es cierto incluso para las conversiones de puntero; es posible que diferentes tipos de puntero tengan diferentes representaciones).

Tenga en cuenta que no hay tal cosa como un "elenco implícito" en C.

Algunas conversiones son explícitas, especificadas por un operador de conversión. Otros son implícitos y se aplican en ciertos casos cuando se usa una expresión de un tipo en un contexto que necesita una expresión de un tipo diferente. La conversión realizada es exactamente la misma en cualquier caso.

Por ejemplo:

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 ++ es similar; que tiene los mismos moldes y conversiones como C, y se añade un equivalente de notación funcional a una expresión de conversión de estilo C, además de 4 palabras clave más específicas: const_cast, dynamic_cast, reinterpret_cast, y static_cast.

Keith Thompson
fuente
¿Soy la única persona a la que no le gusta el casting como medio para convertir números de coma flotante a tipos enteros, o tipos enteros más grandes a tipos más pequeños? En mi opinión, el casting debería ser apropiado para situaciones en las que un diseñador de idiomas solo podría elegir un comportamiento plausible, y deberían usarse otros medios de conversión cuando diferentes comportamientos tendrían sentido en diferentes contextos. Por ejemplo, se podría argumentar que una lengua debe realizar (int)1.5-2*(int)(-1.5)rendimiento 3, 4, 5 o 6, pero si (int)había sido reemplazado con truncInt, roundPeriodicInt, floorInt, o roundEvenInt, ...
supercat
... no habría ambigüedad. Del mismo modo, cuando se convierte un tipo entero más largo en uno más corto, hay casos en los que se esperan números que no se ajustan al tipo más pequeño y deberían ajustarse, y hay casos en que dichos números son inesperados y deberían desencadenar una excepción. Diferentes lenguajes tienen comportamientos diferentes con tales modelos, por lo que no es evidente qué comportamiento debería tener un modelo. A menos que un lenguaje tenga tipos enteros envolventes y no envolventes (un buen concepto de diseño, en mi humilde opinión, aunque no sé nada de eso), especificar si se espera envolver parece útil.
supercat
@supercat: al menos en C, un reparto siempre especifica el mismo tipo de conversión que se realizaría implícitamente mediante una asignación a un objeto del mismo tipo, si se trata de una de las conversiones (principalmente entre tipos aritméticos) hecho implícitamente Se pueden realizar otros tipos de conversiones, por ejemplo, especificando el tipo de redondeo / truncamiento para punto flotante, mediante llamadas de función.
Keith Thompson
Ciertamente se pueden usar funciones; Mi punto es que creo que las funciones o los miembros deberían considerarse como el medio adecuado para realizar conversiones cuyos resultados podrían no representar los valores originales. Sé que C permite conversiones implícitas de flotante a entero, y la compatibilidad dicta que probablemente siempre tendrá que hacerlo, pero eso no significa que deba hacerlo. Pascal requiere una llamada Roundo, en mi Trunchumilde opinión, un diseño mucho más limpio.
supercat
1

Durante la conversión, lee la instancia de una clase como si fuera la instancia de otra clase. Podría ser aplicable para este par de clases o no. No hay tiempo de ejecución, excepto la comprobación. A menudo, la posible incompatibilidad se puede detectar en la etapa de compilación.

Durante la conversión, recombina o vuelve a contar los campos de una instancia de una clase en una instancia de otra clase. Si hay una función para ello, podría ser aplicable o no para esta misma instancia. Todo el trabajo se realiza durante el tiempo de ejecución. No se pudo comprobar ningún error durante la compilación.

Gangnus
fuente
Eso suena específico del idioma. ¿A qué idioma te refieres?
Keith Thompson
Java, C ++, C #, Pascal / Delphi.
Gangnus
C ++ usa los términos "conversión" y "conversión" de la misma manera que el estándar C, con la adición de algunas palabras clave de conversión especializadas; mira mi respuesta
Keith Thompson