2015-12-03 7 views
2

Здесь, в этом коде, я использую unsigned int и хочу завершить мой цикл, как только он достигнет «0». Но это никогда не происходит, проходит '0'Почему этот цикл становится бесконечным циклом в C?

#include <stdio.h> 
typedef unsigned int uint32_t ; 

delay (uint32_t x){ 
    uint32_t y = 0; 
    for(y=x; y>= 0; y--){ 
     printf("Display number %d\n", y); 
    } 
} 

int main() 
{ 
    uint32_t times = 10; 

    printf("Hello World!\n"); 
    delay(10); 
    return 0; 
} 

Выход:

Hello World! 
Display number 10 
Display number 9 
Display number 8 
Display number 7 
Display number 6 
Display number 5 
Display number 4 
Display number 3 
Display number 2 
Display number 1 
Display number 0 
Display number -1 
Display number -2 
Display number -3 
Display number -4 
Display number -5 
Display number -6 

Link: For code from: code.hackerearth.com

+4

Это будет продолжаться до тех пор, пока 'y' становится отрицательным. 'y' не имеет знака, поэтому он не может стать отрицательным –

+1

' y' is un * unsigned * integer ('uint32_t'), поэтому он всегда *'> = 0'. Итак 'uint32_t y = 0; для (y = x; y> = 0; y -) '- бесконечный цикл. – lurker

ответ

1

Рассмотрим for(y=x; y>= 0; y--){y никогда не может быть ниже 0, так что это тип без знака. Как только y равно 0, y-- будет обернуть вокруг до std::numeric_limits<uint32_t>::max(). Поэтому цикл for никогда не заканчивается.

Тот факт, что printf отображает негативы, является проявлением неопределенного поведения на вашем компьютере, использующем неверный спецификатор формата для неподписанного типа.

+0

Да, я знаю проблему сейчас, это было% d, что меня обманули благодаря :-) – AnuragChauhan

2

unsigned номер всегда будет больше или равна 0.

Ваш компилятор должен предупредить вас об этой ошибке.

Причина, по которой вы видите отрицательные числа на выходе, заключается в том, что вы печатаете беззнаковое число с помощью %d.

+0

Спасибо за ваш ответ: -) – AnuragChauhan

0

число без знака всегда будет больше или равна 0.

Измените это

delay (uint32_t x){ 
    uint32_t y = 0; 
    for(y=x; y>= 0; y--){ 
     printf("Display number %d\n", y); 
    } 
} 

с

delay (uint32_t x){ 
    int y = 0; 
    for(y=(int)x; y>= 0; y--){ 
     printf("Display number %d\n", y); 
    } 
} 
0

y является беззнаковое, поэтому он никогда не будет отрицательным. Вы можете определить его как int

int y = 0; 

или изменить for к dowhile

y = x; 
do { 
    printf("Display number %d\n", y); 
} while (--y >= 0); 
+0

Мне нравится вторая идея, но OP необходимо исправить UB из-за неправильного спецификатора формата. – Bathsheba