Оператор %
- это оператор остатка . Он производит остаток от деления операндов (результат отрицательный, если левый операнд отрицательный).
Оператор декремента при применении к uint
значению 0
приводит к положительный результат значение 4,294,967,295
. Остаток от деления этого числа на 7
равен 3
(613,566,756
умноженное на 7
равно 4,294,967,292
, что на 3
меньше uint.MaxValue
, т.е. 4,294,967,295
).
Другими словами, код делает именно то, что вы ему сказали. Вы не можете полагаться на оператор остатка для обработки вашего сценария, а не когда тип данных, который вы используете, является беззнаковым.
Обратите внимание, что это будет работать:
uint counter = 0;
private void getting_Next_Pic()
{
if(next == true)// Here "**next**" is boolean variable
{
counter = (counter + 1) % 7; // Getting the next pic, Flow in Forward Direction
}
else
{
counter = (counter + 6) % 7; // Getting the previous pic, Flow in Reverse Direction
}
}
Добавление 6
то же самое, что и вычитание 1
модуля 7
.
С учетом всего сказанного, я предпочитаю не использовать оператор остатка для такого рода вещей. На самом деле нет необходимости в сложном коде или даже в попытках оптимизировать производительность (даже если это сделал оператор остатка, чего в большинстве случаев нет). IMHO, лучше просто выполнить фактическую проверку диапазона, которая вас действительно волнует:
int counter = 0;
private void getting_Next_Pic()
{
counter += next ? 1 : -1;
if (counter < 0)
{
counter = 6;
}
else if (counter > 6)
{
counter = 0;
}
}
Затем, когда вы читаете код, он фактически говорит, что именно он делает. Проверить его правильность легко, и вы не запутаете ни вас, ни кого-либо еще, пытаясь выяснить это позже.