Почему это для l oop с беззнаковым int бесконечным? - PullRequest
0 голосов
/ 18 марта 2020
for (unsigned i = 0; i < 3; i++) {
    if (i == 2) i = -1;
}

Я не могу понять, почему это oop бесконечно. Я получаю, что это оборачивается, когда i = -1, но UINT_MAX больше 3.

Ответы [ 4 ]

3 голосов
/ 18 марта 2020

Если я переписываю ваш код, тогда может быть более понятно, почему

unsigned i = 0;
while (i < 3) {
    if (i == 2) i = -1;
    i++;
}

i++ происходит в конце l oop, поэтому i снова становится 0.

1 голос
/ 18 марта 2020

Если вы хотите, чтобы при условии l oop

for (unsigned i = 0; i < 3; i++) {
    if (i == 2) i = -1;
}

сравнивались UINT_MAX с 3, вы должны написать

for (unsigned i = 0; i < 3; i++) {
    if (i == 2) i = -2;
}

В этом случае увеличивая i, вы получите UINT_MAX. В противном случае, если i уже содержит UINT_MAX, то, увеличив его в выражении l oop i++, вы получите 0 и, как результат, бесконечное l oop.

Или вы можете написать, например, следующим образом

for (unsigned i = 0; i < 3; i++) {
    if (i == 2) i = ~i;
}
1 голос
/ 18 марта 2020

потому что как только i станет 2, оно изменится на 0, затем с i++, l oop продолжится до i=2 снова, и поэтому снова изменится на 0, и тот же процесс будет go вкл.

0 голосов
/ 18 марта 2020

потому что для l oop будет выполнено в соответствии с этой схемой

for (unsigned i = 0; i < 3; i++)

1 >> начальное значение (i = 0) только на первой итерации 2 >> проверьте состояние терминала

(i<3)

3 >> выполнить код

(if(i==2) i=-1) 

4 >> пошаговый шаг i ++, поэтому (я всегда становился нулевым) как (-1 + 1 = 0), так что это l oop бесконечный l oop

...