2015-04-23 18 views
9

Ho il seguente codiceC++ tipo si verifica nel Funzioni ignorato (il termine doppia, a condizione int)

#include <iostream> 

using namespace std; 

int dmult(int a, int b){ 
    return 2*a*b; 
} 

int main(void) 
{ 
    double a = 3.3; 
    double b = 2; 
    int c = dmult(a,b); 
    cout << c << endl; 
    return 0; 
} 

Compila con MinGW senza problemi. Il risultato è (come pensavo) falso. È un problema del compilatore che non vi è alcun avviso, che una funzione che si aspetta numeri interi, ma alimentata con doppio, può compilare senza preavviso anche se il tipo di input è sbagliato? Significa che C++ ignora il tipo di input di una funzione? Non dovrebbe rendersi conto che gli argomenti della funzione hanno il tipo sbagliato?

+0

Ci sono molte conversioni implicite. Un match di tipo esatto è il migliore. – chris

+0

Ancora un altro motivo per compilare con '-Wall -Wextra -Wconversion'. – jww

+0

@jww, francamente, sono rimasto un po 'sorpreso dal fatto che '-Wall -Wextra' non fa il lavoro e ha bisogno dell'ulteriore' -Wconversion' – vsoftco

risposta

9

double sono implicitamente convertibili in int s (e troncati) e il compilatore non è obbligato dallo standard ad emettere un avviso (fa del suo meglio per eseguire la conversione ogni volta che è possibile). Compila con -Wconversion

g++ -Wconversion program.cpp 

e avrai il tuo avvertimento:

avvertimento: la conversione a 'int' dal 'doppio' possono alterare il suo valore [-Wfloat conversione]

I flag di avviso tipici -Wall -Wextra non vengono rilevati poiché molte volte è l'intenzione del programmatore di troncare double 's a int' s.

Esempio dal vivo here.

1

C++ lancia automaticamente float e raddoppia ai letterali interi troncandoli. quindi 3.3 diventa 3 quando chiami dmult (3.3,2)

Problemi correlati