Смотрите фокус. Такой код выполняется:
unsigned int i = 0, N = 5;
while (i < N) {
std::cout << i << "\n";
++i;
}
А в таком стиле нет:
unsigned int i = 0, N = 5;
while (i - N < 0) {
std::cout << i << "\n";
++i;
}
Дело в том, что умный компилятор понял, что арифметическая операция с беззнаковыми числами всегда неотрицательна, и просто выкинул ваш цикл как бесполезный. Так что лучше использовать знаковые счётчики.
UPDATE
Точнее, может, он и не выкидывает, но разница это беззнаковое число, поэтому больше нуля ,поэтому первая итерация цикла не выполняется и цикл заканчивается.