Le conversioni implicite C / C ++ possono causare errori. Ecco un esempio:
int foo, bar;
scanf("%d", &foo);
scanf("%d", &bar);
float foobar = foo / bar;
Se inserisco 7
e 2
, non è 3.5
come previsto - è 3
- > bug (ignoriamo l'overflow del buffer).
gcc's -Wconversion
avverte su questo tipo di cose, quindi l'ho acceso. Ma mi sembra che stia andando oltre le righe con gli avvertimenti. Ad esempio, questo:
int foo;
float bar;
scanf("%d", &foo);
scanf("%f", &bar);
float foobar = foo / bar;
Provoca un avvertimento:
warning: conversion to 'float' from 'int' may alter its value [-Wconversion]
Anche se funziona come previsto, restituendo 3.5
quando inserisco 7
e 2
. So che float non può rappresentare con precisione tutti i possibili valori int, ma mi sto chiedendo se aggiungere un cast qui faccia qualcosa per aiutare - oltre ad aggiungere altro codice. Nell'esempio sopra, il cast di uno dei valori int dell'espressione float ha effettivamente modificato il risultato, non sostituendo un cast implicito di uno esplicito in questo esempio.
Questo per gli avvisi di conversione float in int, ma non è tutto. C'è anche la segnalazione di avvisi di conversione. Esempio tradizionale:
std::vector<char> chars = get_chars();
for (int i = 0; i < chars.size(); i++)
std::cout << chars[i] << std::endl;
Causa questo avviso:
warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
Potrei usare il più ingombrante unsigned int
per la variabile indice, che richiederà un ulteriore casting quando eseguo i calcoli con esso. Tutto per la situazione insolita che ho tra 2^31 + 1
e 2^32
elementi nel mio vettore e non faccio alcun calcolo con la variabile index che lo ha lanciato su int.
Quindi, la mia domanda è: quali avvisi di conversione hanno senso nella pratica? L'aggiunta di cast espliciti per risolverli migliora davvero qualcosa?