почему этот цикл идет в бесконечном цикле выполнения? - PullRequest
2 голосов
/ 26 сентября 2011

см. У меня есть такой код

int main () {
    uint32_t i ;
    for(i=4;i>=0;i--)
            printf("i is %d \n",i);

    return 0;
}

это идет в бесконечном цикле. Почему значение I ниже 0, а цикл все еще идет к исполнителю?

Ответы [ 3 ]

11 голосов
/ 26 сентября 2011

uint32_t означает целое число без знака и поэтому его значение всегда> = 0 - таким образом, ваш цикл выполняется бесконечно.

Обратите внимание, что многие компиляторы выдают предупреждение, указывающее, что i>=0 сравнение всегда верно.

6 голосов
/ 26 сентября 2011

Вы видите отрицательные значения в вашем printf, потому что вы печатаете его как %d, но в условии uint32_t всегда положительно (вы делаете переполнение).

1 голос
/ 26 сентября 2011

Вы используете uint32_t, означающее unsigned, и затем проверяете условие в цикле for, что i> = 0, поэтому, когда цикл выполняется для значения i = 0, а затем он делает i = -1, но я не подписан, поэтому он сделаетзначение i INT_MAX (что когда-либо поддерживает ваша система).так и до сих пор значение больше 0, так что условие истинно.

И ответ на то, как он печатает отрицательные значения для i, заключается в том, что вы используете «% d» для подписи.

Если вы хотите увидеть результат, вы можете использовать опцию '% u', чтобы он напечатал исходное беззнаковое значение i.

Если вы хотите получить результат, который вы хотите от программы, попробуйтеприведение uint к int во время проверки состояния.

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