unsigned int декремент в порядке, но когда он принимает модуль, он дает неправильный результат - PullRequest
0 голосов
/ 12 июля 2020

Код if дает правильный результат, но часть else дает результат: 3,2,1,0, и я ожидаю 6,5,4,3,2,1,0 результата.

uint  counter = 0;
private void getting_Next_Pic()
{
    if(next == true)// Here "**next**" is boolean variable
    {
        counter = ++counter % 7;   // Getting the next pic, Flow in Forward Direction
    }
    else
    {
        counter = counter-- % 7;   // Getting the previous pic, Flow in Reverse Direction
    }
}

1 Ответ

0 голосов
/ 29 августа 2020

Оператор % - это оператор остатка . Он производит остаток от деления операндов (результат отрицательный, если левый операнд отрицательный).

Оператор декремента при применении к 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;
    }
}

Затем, когда вы читаете код, он фактически говорит, что именно он делает. Проверить его правильность легко, и вы не запутаете ни вас, ни кого-либо еще, пытаясь выяснить это позже.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...