Eigenlijk zijn er twee manieren waarop je de modulo-operator zou kunnen definiëren. De methode die jouw compiler er op nahoudt heeft als voordeel dat (-a)%b gelijk is aan a%(-b) en -(a%b), wat ook precies geldt voor deling. Zo beredeneerd is die aanpak wel logisch en soms is dat ook handig.
Verder kun je het ook zo zien. Normaal gesproken geldt: a = b*(a/b) + a%b (voor elke a en b, mits b niet 0). Dat betekent dat de manier waarop de modulo operator werkt samenhangt met de manier waarop de deel operator werkt. De concrete vraag is of bij deling naar beneden afgerond wordt of naar de nul. in C++ wordt altijd naar de nul afgerond en dat betekent dat de modulo negatief moet worden, want als a=-5 en b=3, dan geldt a/3=-5/3=-1 en moet -5%3 wel gelijk zijn aan -2 (terwijl jij misschien 1 wilde zien). Als je omlaag zou afronden geldt echter a/3=-2 en dan is -5%3 inderdaad gelijk aan 1 (want 3*-2+1=-5).
In C89 is dat trouwens niet gespecificeerd. In C99 en C++ gelukkig wel en dus kun je er rekening mee houden zoals OlafvdSpek al zei: a = (a - 1 + b) % b. Let er wel op dat je dan geen getal kan aftrekken wat groter is dan b, anders moet je wat anders verzinnen.
[
Voor 38% gewijzigd door
Soultaker op 17-02-2005 23:03
]