¿Por qué el bucle infinito cuando el tipo de datos no está firmado int?

El código siguiente se ejecuta perfectamente. Da el resultado correcto pero, en el momento en que cambio el signo de las variables de firmado a no firmado, el progtwig se ejecuta en un bucle infinito. El progtwig es encontrar el factorial de enteros. El valor de cualquier variable no se vuelve negativo en ninguna parte. Soy consciente del comportamiento modular del int sin signo.

#include int main(void) { int a[200], i,index, number, next, count, temp, test, x; scanf(" %d", &test); while(test--) { scanf(" %d", &number); a[0]=1; count=1; //1 digit for(next=2;next<=number;++next) { index=0;temp=0; for(i=0;i=0;--i) printf("%d",a[i]); printf("\n"); } return 0; } 

Un unsigned int nunca puede ser negativo, por lo que i >= 0 mantiene true todo el tiempo, lo que significa que un bucle como

 unsigned int value; value = 10; while (value-- >= 0) {} 

es efectivamente un bucle de color, así como su for (i = count - 1 ; i >= 0 ; --i) is.

Los comstackdores advierten sobre esto, por lo tanto, si comstack el código que pasa las banderas correctas al comstackdor, debería indicarle que la condición siempre será verdadera.

Debe tener en cuenta que si bien el >= no hace ninguna diferencia al respecto,

 unsigned int value; value = 10; while (value-- != 0) {} 

funciona, mientras while (value-- > 0) también lo hace, porque el value puede ser 0 , pero no puede ser < 0 .

Además, no hay desbordamiento de entero unsigned int signo, por lo que el bucle será infinito sin causar un comportamiento indefinido, esta respuesta tiene una explicación de lo que sucede cuando sums 1 al valor máximo, si restas uno del valor mínimo, entonces estoy Seguro que puedes " adivinar " lo que pasaría de la misma respuesta.

El problema es ese,

 for(i=count-1;i>=0;--i) 

Nunca saldrá si no está firmado. Debido a que i no está firmado, siempre será mayor o igual a cero y, por lo tanto, el bucle no puede terminar.

Como ya se han señalado otras respuestas, el bucle

 for(i=count-1;i>=0;--i) 

es un bucle infinito si no está firmado. Puede ser reescrito en una forma diferente como

 for (i = count - 1; i != -1; --i) 

que funcionará según lo previsto para i firmado y sin firmar. Sin embargo, algunos pueden encontrarlo menos legible que el original.