Existe uma diferença entre tipos de conversão e conversão em linguagens de programação imperativas?

8

A questão surgiu em uma discussão no StackOverflow.

Existe uma distinção clara entre os dois conceitos expressos e convertidos (a respeito do tipo de um objeto), ou essas duas palavras descrevem exatamente a mesma coisa? E quanto a outras linguagens além de C ++, Python e Java? EDIT : E se os tipos em questão são tipos primitivos, como inta float?

krlmlr
fonte

Respostas:

5

Teoricamente falando , os dois conceitos são muito diferentes:

A conversão de tipo refere-se à troca de um tipo (grosso modo, uma estrutura de objeto) por outro, enquanto a Conversão de tipo refere-se à tradução de valores (grosso modo, conteúdo do objeto), para que possam ser interpretados como pertencentes a um novo tipo. Teoricamente, eles nunca se misturam .

Dito isso, na prática , enquanto você pode ter um sem o outro, é quase sempre uma má idéia. Raramente faz sentido mudar sua percepção da estrutura de um objeto, sem também alterar seu conteúdo. Praticamente, eles quase sempre são os mesmos

blueberryfields
fonte
3
Isso fica ainda mais divertido com uma linguagem de tipo fraco, como C, você pode simplesmente se referir a uma seção da memória como um tipo diferente!
Sheldon Warkentin 02/02/12
Não é assim que os termos "conversão" e "conversão" são usados ​​em C. Veja minha resposta.
Keith Thompson
Eu editei a pergunta. Você tem alguma opinião sobre isso? Obrigado!
krlmlr
A resposta não muda para os primitivos.
Blueberryfields
"Raramente faz sentido mudar sua percepção da estrutura de um objeto, sem também alterar seu conteúdo". Não é este o objetivo de subtipagem e polimorfismo? segurando uma referência a um AbstractSpritetempo sem ter idéia de que é realmente um BigGreenTreeSprite?
Sara
3

Idiomas diferentes definem as palavras "converter" e "converter" de maneira diferente; Não acho que a questão seja significativa a não ser em referência a um idioma específico.

Em C, por exemplo, o termo "conversão" refere-se corretamente apenas a um operador de conversão explícito, consistindo em um nome de tipo entre parênteses que precede a expressão a ser convertida. Uma "conversão" converte um valor de um tipo em um valor de outro tipo; algumas conversões são implementadas reinterpretando os bits que compõem a representação, mas é definida como uma conversão de valor em valor. (Sim, isso é verdade mesmo para conversões de ponteiro; é possível que diferentes tipos de ponteiro tenham representações diferentes.)

Observe que não existe uma "conversão implícita" em C.

Algumas conversões são explícitas, especificadas por um operador de conversão. Outros estão implícitos e são aplicados em certos casos quando uma expressão de um tipo é usada em um contexto que precisa de uma expressão de um tipo diferente. A conversão realizada é exatamente a mesma em ambos os casos.

Por exemplo:

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 ++ é semelhante; tem os mesmos moldes e conversões como C, e adiciona uma anotação funcional equivalente a uma expressão de conversão de estilo C, mais 4 palavras-chave mais específicas: const_cast, dynamic_cast, reinterpret_cast, e static_cast.

Keith Thompson
fonte
Eu sou a única pessoa que não gosta de conversão como meio de converter números de ponto flutuante em tipos inteiros, ou tipos inteiros maiores em menores? Na minha opinião, o casting deve ser apropriado para situações em que um designer de linguagem pode escolher apenas um comportamento plausível, e outros meios de conversão devem ser usados ​​quando comportamentos diferentes fazem sentido em contextos diferentes. Por exemplo, pode-se argumentar que uma linguagem deve fazer (int)1.5-2*(int)(-1.5)rendimento de 3, 4, 5 ou 6, mas se (int)tinha sido substituído com truncInt, roundPeriodicInt, floorIntou roundEvenInt, ...
supercat
... não haveria ambiguidade. Da mesma forma, ao converter um tipo inteiro mais longo para um menor, há casos em que números que não se encaixam no tipo menor são esperados e devem ser agrupados, e há casos em que esses números são inesperados e devem desencadear uma exceção. Linguagens diferentes têm comportamentos diferentes com esses elencos, portanto, dificilmente é evidente o comportamento que um elenco deve ter. A menos que uma linguagem tenha tipos inteiros de quebra automática e sem quebra automática (um bom conceito de design, IMHO, embora eu não conheça nenhum), especificar se a quebra automática é esperada parece útil.
Supercat
@ supercat: Pelo menos em C, um elenco sempre especifica o mesmo tipo de conversão que seria implicitamente realizado por uma atribuição a um objeto do mesmo tipo - se é uma das conversões (principalmente entre tipos aritméticos) que pode ser feito implicitamente. Outros tipos de conversões, por exemplo, especificando o tipo de arredondamento / truncamento para ponto flutuante, podem ser feitos por meio de chamadas de função.
Keith Thompson
Certamente funções podem ser usadas; meu argumento é que acho que funções ou membros devem ser considerados os meios adequados para realizar conversões cujos resultados podem não representar os valores originais. Eu sei que C permite conversões implícitas de flutuação para número inteiro, e a compatibilidade determina que provavelmente sempre será necessário, mas isso não significa que deva. Pascal requer uma chamada para Roundou Trunc--IMHO um design muito mais limpo.
Supercat
1

Durante a transmissão, você lê a instância de uma classe como se fosse a instância de outra classe. Pode ser aplicável a este par de classes ou não. Nenhum trabalho de tempo de execução, exceto a verificação. Muitas vezes, a possível incompatibilidade pode ser detectada no estágio de compilação.

Durante a conversão, você recombina ou reconta campos de uma instância de uma classe em uma instância de outra classe. Se houver uma função para ela, ela pode ser aplicável ou não para essa mesma instância. Todo o trabalho é feito durante o tempo de execução. Nenhum erro pode ser verificado durante a compilação.

Gangnus
fonte
Isso parece específico do idioma. A que idioma você está se referindo?
Keith Thompson
Java, C ++, C #, Pascal / Delphi.
Gangnus
C ++ usa os termos "conversão" e "conversão" da mesma maneira que o padrão C, com a adição de algumas palavras-chave especializadas de transmissão; veja minha resposta.
Keith Thompson