#include int main() { char c; c=10; if(c%2==0) printf("Yes"); return 0; }
Le code ci-dessus imprime “Oui”. Quelqu’un peut-il dire pourquoi l’opérateur de module fonctionne pour char
et int
mais pas pour double
etc.?
Vous avez déjà des commentaires expliquant pourquoi %
est défini pour char
: il est défini pour tous les types d’entiers, et en C, char
est un type entier. D’autres langages définissent un type de caractère distinct qui ne prend pas en charge les opérations arithmétiques, mais C n’en fait pas partie.
Mais pour répondre pourquoi il n’est pas défini pour les types à virgule flottante: historique. Il n’y a pas de raison technique pour laquelle il ne serait pas possible de définir l’opérateur %
pour les types à virgule flottante. Voici ce que dit le raisonnement C99:
6.5.5 Opérateurs multiplicatifs
[…]
Le Comité C89 a rejeté l’extension de l’opérateur
%
aux travaux sur les types flottants, car une telle utilisation ferait double emploi avec la fonctionnalité fournie parfmod
(voir le §7.12.10.1).
Et comme mafso retrouvé plus tard:
7.12.10.1 Les fonctions fmod
[…]
Le Comité C89 a examiné une proposition visant à utiliser le rest opérateur
%
pour cette fonction; mais il a été rejeté car les opérateurs correspondent généralement à des équipements matériels, etfmod
n’est pas pris en charge dans le matériel de la plupart des machines.
Ils semblent un peu contradictoires. L’opérateur %
n’a pas été prolongé parce que fmod
déjà fmod
ce besoin, mais fmod
été choisi pour répondre à ce besoin car le comité ne souhaitait pas étendre l’opérateur %
? Ils ne peuvent pas très bien être tous les deux vrais en même temps.
Je soupçonne que l’une de ces raisons était la raison initiale, et l’autre était la raison pour laquelle elle ne reverrait pas cette décision plus tard, mais rien ne dit qui était le premier. Quoi qu’il en soit, il a simplement été décidé que %
n’effectuerait pas cette opération.