48 votes

% (mod) explication

Aujourd'hui, j'écrivais un programme en C#, et j'ai utilisé % pour calculer un index... Mon programme ne fonctionnait pas, alors je l'ai débogué et j'ai réalisé que " % " ne fonctionne pas comme dans les autres langages de programme que je connais.

Par example:

En Python, % renvoie des valeurs comme celle-ci :

 for x in xrange (-5, 6):
     print x, "% 5 =", x % 5

-5 % 5 = 0
-4 % 5 = 1
-3 % 5 = 2
-2 % 5 = 3
-1 % 5 = 4
0 % 5 = 0
1 % 5 = 1
2 % 5 = 2
3 % 5 = 3
4 % 5 = 4
5 % 5 = 0

En C# :

 for (int i = -5; i < 6; i++)
{
    Console.WriteLine(i + " % 5 = " + i % 5);
}

-5 % 5 = 0
-4 % 5 = -4
-3 % 5 = -3
-2 % 5 = -2
-1 % 5 = -1
0 % 5 = 0
1 % 5 = 1
2 % 5 = 2
3 % 5 = 3
4 % 5 = 4
5 % 5 = 0

Ai-je fait quelque chose de mal ou % ne fonctionne pas comme il se doit ?

19voto

David Heffernan Points 292687

Comme expliqué dans les commentaires, le comportement différent est par conception. Les différentes langues attribuent simplement des significations différentes à l'opérateur %

Tu demandes:

Comment puis-je utiliser l'opérateur de module en C# ?

Vous pouvez définir vous-même un opérateur de module qui se comporte de la même manière que l'opérateur %

 int mod(int a, int n)
{
    int result = a % n;
    if ((result<0 && n>0) || (result>0 && n<0)) {
        result += n;
    }
    return result;
}

9voto

Niet the Dark Absol Points 154811

Les deux réponses sont correctes. Bien que personnellement, je pense que le "toujours positif" a plus de sens.

Vous pouvez définir votre propre fonction de module qui ne donne que des réponses positives comme celle-ci :

 int mod(int a, int n) {
    return ((a%n)+n) % n;
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X