Hola
for (i = 0; i <= num; i++){
fact = 1;
for (j = i; j > 1; j--)
fact *= j;
printf("%2d! = %ld\n", i
, fact
); }
Si es que i=0, cuando entra al bucle for, asigna a j=i (osea cero) y luego dice hasta que j>1. Pero 0 no es mayor que 1, osea, ¿Cómo es que j puede retroceder desde 0 hasta mayor que 1?
No es que retroceda desde 0 hasta mayor que 1, simplemente no cumple la condición del for y no entra, por lo que fact vale 1.
Lo tercero es respecto al valor de devolución al final, en la sentencia return:
return EXIT_SUCCESS;
Siempre he visto que han devuelto el 0, y lo aplico siempre aunque nunca he comprendido el porqué. Por allí leí que indica que el programa termina con éxito. En otros lados e leído que para que el programa empiece a funcionar, el sistema operativo invoca a main, y a final, main le devuelve el número 0 al sistema operativo indicándole que el programa terminó con éxito. Pero hasta ahora nunca me he podido percatar que el programa falle o que termine sin éxito, siempre he visto que termina.
El return 0 indica al SO si el programa se ha ejecutado con éxito. Si por ejemplo tú creas un programa con un bucle infinito, al cerrarlo, el SO sabrá que algo ha fallado porque no recibe ese 0, ya que no se ha ejecutado entero y no ha devuelto el 0. En Windows 7 cuando pasa algo "raro" el propio SO te avisa de que el programa no funciona bien y debe cerrarse. Para eso es ese return 0 o return EXIT_SUCCESS.
En cuanto a lo que preguntas de los tamaños de int y long int no tengo ni idea.
Saludos