В первом случае i не инициализируется, поэтому поведение не определено.В вашем случае i имеет ненулевое значение, а для вращается без конца, потому что его значение никогда не меняется при печати, но опять же, это поведение не определено.
Inвторой случай i равен 0, поэтому тело для никогда не выполняется
for (;i;)
эквивалентно while(i)
Переменная не по умолчанию инициализируется в 0.
Если вы хотите написать, например, 5 раз Hello, вы можете сделать:
int i;
for (i = 5 ;i; --i)
{
printf("Hello ");
}
этот код эквивалентенк тому, используя другую нотацию / оператор, если это может помочь вам понять:
int i = 5;
while (i != 0) {
printf("Hello ");
i -= 1;
}
и добавить putchar('\n');
после цикла для печати новой строки - тоже неплохая идея