Tout le monde a oublié Pascal?
1/6
rendements 0.1666666...
(quelle que soit la précision prise en charge).
1 div 6
les rendements 0
On peut se demander si la règle C est une erreur. Presque tous les opérateurs arithmétiques de C, où les opérandes sont du même type, donnent un résultat du même type. Il y a quelque chose à dire pour la cohérence.
De plus, puisque C est principalement destiné au code au niveau du système, la plupart des programmes C n'utilisent pas du tout de virgule flottante. À un moment donné, l'ajout accidentel de code à virgule flottante à un programme qui n'en aurait pas besoin autrement pourrait être un problème grave. C'est probablement toujours le cas, pour les petits systèmes embarqués - qui, encore une fois, sont une cible majeure pour C.
Dans la plupart des programmes C, tronquer la division entière est probablement exactement ce que vous voulez de toute façon.
Si a 1 / 6
donné un résultat à virgule flottante en C, alors:
- Ce serait une incohérence dans la langue.
- La norme devrait faire un choix arbitraire dont le type à virgule flottante à utiliser pour le résultat (
double
peut sembler le choix naturel, mais vous pouvez préférer la précision supplémentaire long double
)
- Le langage devrait encore avoir une opération de division entière; effectuer une addition en virgule flottante puis tronquer ne serait probablement pas suffisant.
C aurait pu fournir des opérateurs distincts pour les deux types de division, mais le deuxième point ci-dessus s'appliquerait toujours: lequel des trois types à virgule flottante serait utilisé pour le résultat? Et comme il est assez facile d'obtenir une division en virgule flottante si vous en avez besoin (utilisez une constante à virgule flottante pour l'un des opérandes ou les deux, ou convertissez l'un des opérandes ou les deux en type à virgule flottante), cela n'a apparemment pas été '' t considéré que important.
Dans la version 1974 du manuel C (soit 4 ans avant la publication de la première édition de K&R), Ritchie ne mentionne même pas la confusion possible:
Le binaire / opérateur indique la division. Les mêmes considérations de type que pour la multiplication s'appliquent
qui dit que si les deux opérandes sont de type int
ou char
, le résultat est de type int
.
Oui, c'est une source de confusion pour certains programmeurs C, en particulier les débutants - mais C n'est pas réputé pour être très convivial pour les novices.