Domanda

Ho cercato di ridurre conversioni di tipo implicite quando uso costanti denominate nel mio codice. Per esempio invece di usare

const double foo = 5;

Vorrei utilizzare

const double foo = 5.0;

in modo che una conversione di tipo non ha bisogno di prendere posto. Tuttavia, nelle espressioni in cui faccio qualcosa di simile ...

const double halfFoo = foo / 2;

ecc. È che 2 ha valutato come un intero e viene implicitamente convertito? Dovrei usare un 2.0, invece?

È stato utile?

Soluzione

Il 2 viene implicitamente convertito in un letto perché foo è un doppio. Dovete stare attenti perché se foo era, diciamo, un numero intero, divisione intera verrebbe eseguita e quindi il risultato sarebbe stato memorizzato in halfFoo.

Credo che sia buona pratica utilizzare sempre letterali in virgola mobile (ad esempio 2.0 o 2. ovunque si intende per loro di essere utilizzati come valori in virgola mobile. E 'più coerente e può aiutare a trovare bug perniciose che possono sorgere con questo genere di cose.

Altri suggerimenti

Questo è noto come Tipo coercizione . Wikipedia ha una bella po 'su di esso:

  

conversione di tipo implicita, noto anche come coercizione, è una conversione di tipo automatico dal compilatore. Alcuni linguaggi permettono, o addirittura richiedono, compilatori per fornire la coercizione.

     

In un'espressione di tipo misto, dati di uno o più sottotipi possono essere convertiti in un supertipo, se necessario in fase di esecuzione in modo che il programma verrà eseguito correttamente.

     

...

     

Questo comportamento deve essere usato con cautela, in quanto possono verificarsi conseguenze non intenzionali. I dati possono essere persi quando rappresentazioni in virgola mobile vengono convertiti in rappresentazioni integrali come verranno troncati i componenti frazionarie dei valori in virgola mobile (arrotondato per difetto). Viceversa, convertendo da una rappresentazione solidale ad un virgola mobile si può anche perdere precisione, poiché il tipo a virgola mobile può essere in grado di rappresentare l'intero esattamente (per esempio, galleggiante potrebbe essere un singolo tipo precisione IEEE 754, che non può rappresentare la integer 16777217 esattamente, mentre un tipo intero a 32 bit può). Questo può portare a situazioni come memorizzare lo stesso valore intero in due variabili di tipo integer e tipo reale che restituire false rispetto per l'uguaglianza.

Nel caso di C e C ++, il valore di espressione di tipi integrali (cioè long, numeri interi, bicchierini, caratteri) è il più grande tipo integrale nell'espressione. Non sono sicuro, ma immagino qualcosa di simile accade (assumendo valori in virgola mobile sono "più grande" di tipi interi) con le espressioni che coinvolgono numeri in virgola mobile.

A rigor di termini, ciò che si sta cercando di raggiungere sembra essere controproducente.

normalmente, avrebbe cercare di ridurre il numero di espliciti conversioni di tipo in un programma C e, in generale, per ridurre ogni e qualsiasi tipo dipendenze nel codice sorgente. Buon codice C dovrebbe essere il tipo indipendente possibile. Ciò significa in genere che è una buona idea per evitare eventuali elementi sintattici esplicite che precisare i tipi specifici il più spesso possibile. E 'meglio fare

const double foo = 5; /* better */

di

const double foo = 5.0; /* worse */

perché quest'ultimo è ridondante. Le regole di conversione di tipo implicite del linguaggio C farà in modo che il primo funziona correttamente. Lo stesso si può dire per i confronti. Questo

if (foo > 0)

è meglio che

if (foo > 0.0)

perché, ancora una volta, il primo è più di tipo indipendente.

conversione di tipo implicita in questo caso è una cosa molto buona, non è una cosa negativa. Ti aiuta a scrivere il codice di tipo indipendente generico. Perché stai cercando di evitarli?

E 'vero che in alcuni casi non avete altra scelta, ma per esprimere il tipo in modo esplicito (come l'uso 2.0 invece di 2 e così via). Ma di norma si farlo solo quando si ha veramente. Perché qualcuno dovrebbe farlo senza una reale necessità è oltre me.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top