Помогите понять while в Си

    int a = 0;
while(a <= 5){
    printf("q\n");
    a--;
}

или

    int a = 0;
while(a <= 5){
    printf("q\n");
    a = a - 1;
}

Выводит бесконечный цикл, почему? Как я понимаю должно быть пока 5 больше или равно 0 и 5 раз вывести букву "q" но цикл становится бесконечный.


Ответы (4 шт):

Автор решения: Inventor

У вас цикл выполняется пока a <= 5. Изначально a = 0. В течение всего цикла a уменьшается на 1 и становится -1, -2 и т.д. Условие никогда не выполнится, цикл не прервётся. Нужно увеличивать a на 1, а не уменьшать, чтобы он выполнился 5 раз

→ Ссылка
Автор решения: Harry

Развернем... просто пишу выполняемые строки, это не код.

int a = 0;
while(a <= 5)        // a == 0, OK, работаем
    printf("q\n");   // Выводим a
    a--;             // Уменьшаем а на 1, до -1
while(a <= 5)        // a == -1, OK, работаем     
    printf("q\n");   // Выводим a
    a--;             // Уменьшаем а на 1, до -2
while(a <= 5)        // a == -2, OK, работаем     
    printf("q\n");   // Выводим a
    a--;             // Уменьшаем а на 1, до -3
while(a <= 5)        // a == -3, OK, работаем
    printf("q\n");   // Выводим a
    a--;             // Уменьшаем а на 1, до -4
......

Так понятнее?

Когда дойдете до INT_MIN - минимального представимого числа, произойдет переполнение и, хотя это UB, на самом деле a станет очень большим :) и цикл завершится...

→ Ссылка
Автор решения: Serge Koflik
int a = 0;
while(a <= 5){
    printf("q\n");
    a++;
}

Дословно: Пока а меньше либо равно 5 - выводи q и увеличивай значение a на 1.

В вашем коде a уменьшалось => a никогда не будет больше 5(будет после переполнения переменной), поэтому цикл и был вечным: условие выхода не выполнялось

→ Ссылка
Автор решения: psychotrip

while(a <= 5) В цикле "Пока" Вы уменьшаете переменную a, таким образом она будет уменьшаться до минимального значения типа int (минимальное значение -2 147 483 648). Нужно же наоборот увеличивать переменную a. Вот так a++

→ Ссылка