Je programme en langage c sur mac os x. J’utilise sqrt, de math.h, fonctionne comme ceci:
int start = Data -> start_number; double localSum; for (start; start <= end; start++) { localSum += sqrt(start); }
Cela fonctionne, mais pourquoi? et pourquoi je ne reçois aucun avertissement? Sur la page de manuel de sqrt, il faut un double comme paramètre, mais je lui donne un int – comment cela peut-il fonctionner?
Merci
Les conversions de types qui n’entraînent pas de perte de précision peuvent ne pas déclencher des avertissements. Ils sont exprimés implicitement.
int --> double //no loss in precision (eg 3 became 3.00) double --> int //loss in precision (eg 3.01222 became 3)
Ce qui déclenche ou non un avertissement dépend en grande partie du compilateur et des drapeaux qui lui sont fournis. Cependant, la plupart des compilateurs (du moins ceux que j’ai utilisés) ne considèrent pas les conversions de type implicites suffisamment dangerous
pour justifier un avertissement, comme c’est une caractéristique de la spécification de langue.
C99 Reason le dit comme une ligne direcsortingce
L’un des résultats importants de l’exploration de ce problème (diffusion implicite) est la compréhension du fait que des compilateurs de haute qualité pourraient avoir intérêt à rechercher un code aussi douteux et à proposer des diagnostics (en option), et que des instructeurs consciencieux pourraient également avertir les programmeurs des problèmes. des conversions de types implicites.
Justification du C99 (avril 2003): page 45
Le compilateur connaît le prototype de sqrt
et peut donc produire le code permettant de convertir un argument int
en double
avant d’appeler la fonction.
De même, si vous passez un double
à une fonction (avec un prototype connu) en prenant un argument int
, le compilateur produira le code de conversion requirejs.
Le compilateur et le niveau d’avertissement que vous avez demandé sur la ligne de commande déterminent si le compilateur met en garde sur de telles conversions.
Pour la conversion int -> double
, qui est généralement sans perte (avec les entiers 32 bits (ou 16 bits) et les doubles
64 bits au format IEEE754), il est probablement très difficile d’obtenir un avertissement pour cette conversion.
Pour la conversion double -> int
, avec gcc et clang, vous devez demander spécifiquement de tels avertissements à l’aide de -Wconversion
, -Wconversion
ils comstackront le code en mode silencieux.
Int peut être doublé automatiquement en toute sécurité, sans risque de perte de données. L’inverse n’est pas vrai. Pour transformer un double en int, vous devez le lancer explicitement.
Les compilateurs C font du casting automatique avec double et int. vous pouvez aussi faire ce qui suit:
int start = Data -> start_number; int localSum; for (start; start <= end; start++) { localSum += sqrt(start); }
Même si le localSum est un int, cela fonctionnera toujours, mais il coupera toujours plus loin.
Par exemple, si la valeur de retour de sqrt () est 1,365, elle sera stockée sous la forme d'un simple 1.