Рассмотрим этот код C:
#include "stdio.h"
int main(void) {
int count = 5;
unsigned int i;
for (i = count; i > -1; i--) {
printf("%d\n", i);
}
return 0;
}
Мое наблюдение / вопрос: цикл никогда не выполняется. Но если я изменю тип данных i с unsigned int на int, все будет работать как положено.
Я думал о неподписанных целочисленных значениях как о значениях, которые «оборачиваются», когда вы пытаетесь отнять их. Таким образом, когда я равняюсь нулю и вычитаю 1, он оборачивается в UINT_MAX. И поскольку его значение никогда не бывает отрицательным, это фактически будет бесконечный цикл. (И это именно то, что происходит, когда я меняю сравнение с i> -1 на i> = 0.)
Где-то в моей логике есть ошибка, поскольку цикл никогда не выполняется, если я не подписан, и я сравниваю его с -1. Либо компилятор каким-то образом оптимизирует его, либо значения времени выполнения ведут себя не так, как я ожидаю.
Почему цикл не запускается?