Esiste una differenza tra i tipi di casting e di conversione nei linguaggi di programmazione imperativi?

8

La domanda è arrivata in una discussione su StackOverflow.

Esiste una netta distinzione tra i due concetti cast e convert (riguardo al tipo di un oggetto), o queste due parole descrivono esattamente la stessa cosa? Che ne dici di lingue diverse da C ++, Python e Java? EDIT : cosa succede se i tipi in questione sono tipi primitivi, come int a float ?

    
posta krlmlr 02.02.2012 - 23:53
fonte

3 risposte

4

In teoria , i due concetti sono molto diversi:

Type Casting si riferisce allo scambio di un tipo (in parole povere, una struttura di oggetti) per un altro mentre Conversione di tipi si riferisce alla traduzione di valori (in parole povere, contenuti dell'oggetto ), in modo che possano essere interpretati come appartenenti a un nuovo tipo. In teoria, non mischiano mai .

Detto questo, praticamente parlando , mentre puoi avere uno senza l'altro, è quasi sempre una cattiva idea. Raramente ha senso cambiare la percezione della struttura di un oggetto, senza alterarne il contenuto. In pratica, sono quasi sempre gli stessi

    
risposta data 03.02.2012 - 00:11
fonte
3

Diverse lingue definiscono le parole "cast" e "convert" in modo diverso; Non penso che la domanda sia significativa se non in riferimento a un particolare linguaggio.

In C, ad esempio, il termine "cast" si riferisce correttamente solo a un operatore di cast esplicito, costituito da un nome di tipo tra parentesi che precede l'espressione da convertire. Una "conversione" converte un valore di un tipo in un valore di un altro tipo; alcune conversioni vengono implementate reinterpretando i bit che costituiscono la rappresentazione, ma è definita come una conversione da valore a valore. (Sì, è vero anche per le conversioni puntatore: è possibile che diversi tipi di puntatore abbiano rappresentazioni differenti.)

Nota che non esiste una cosa come un "cast implicito" in C.

Alcune conversioni sono esplicite, specificate da un operatore di cast. Gli altri sono impliciti e vengono applicati in alcuni casi quando un'espressione di un tipo viene utilizzata in un contesto che richiede un'espressione di un tipo diverso. La conversione eseguita è esattamente la stessa in entrambi i casi.

Ad esempio:

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 ++ è simile; ha gli stessi cast e conversioni di C, e aggiunge una notazione funzionale equivalente a un'espressione cast in stile C, più 4 parole chiave più specifiche: const_cast , dynamic_cast , reinterpret_cast e static_cast .

    
risposta data 03.02.2012 - 01:30
fonte
1

Durante il casting, leggi l'istanza di una classe come se fosse l'istanza di un'altra classe. Potrebbe essere applicabile a questa coppia di classi o no. Nessun lavoro di runtime tranne il controllo. Spesso la possibile incompatibilità potrebbe essere colta in fase di compilazione.

Durante la conversione, ricombina o riconta i campi di un'istanza di una classe in un'istanza di un'altra classe. Se esiste una funzione, potrebbe essere applicabile o meno per questa stessa istanza. Tutto il lavoro è fatto durante il runtime. Nessun errore potrebbe essere controllato durante la compilazione.

    
risposta data 03.02.2012 - 00:22
fonte