Подтвердить что ты не робот

Будет ли этот цикл работать бесконечно?

Я сижу в классе, и мне очень опытный учитель сказал, что следующий код завершится, когда STACK memory будет полностью заполнен программой. Теперь я не могу понять, почему? Ниже приведен исходный код: -

#include<stdio.h>

int main()
{
char i;
for (i = 120; i < 130; i++)
    printf("\n%d", i);

return 0;
}

Теперь причина, по которой я чувствую, что этот цикл не завершится, заключается в том, что, как только программа запускается, переменная объявляется в одной ячейке памяти, которая не изменяется до срока действия программы, и мы меняем значение уже объявленная переменная. Поэтому я хотел задать ответ на этот вопрос. Кроме того, если вы считаете, что учитель прав, объясните также:)

Кроме того, я пытался запустить программу в течение длительного времени, но потребление памяти не увеличилось даже немного: |

4b9b3361

Ответ 1

Действия программы зависят от того, как ваша реализация определяет char: это может быть подписанный или неподписанный тип.

Если он неподписан, он выдает 10 номеров и завершает работу.

Если он подписан, он будет завершен до 127, а в большинстве реализаций следующее значение -128. Но в соответствии со стандартом это поведение undefined.

Я не понимаю, почему он должен съесть полный стек - нет рекурсии и нет дополнительного выделения памяти, так что

сказал очень опытный учитель, что следующий код завершится, когда STACK memory будет полностью заполнен программой

означает "никогда" - потому что он просто не заполняет стек. Он не мог быть таким опытным программистом/преподавателем, или ОП не является опытным слушателем и неправильно понял то, что сказал ему учитель.

Ответ 2

причина проста и сложна:)

i не int, а char. Это означает, что его диапазон варьируется от -128 до +127.

Пока цикл вызывает индекс, он будет переполняться на +128, так что значение в памяти будет снова -127. Это означает, что i снова меньше 130! Цикл продолжается и далее...

Теперь продолжайте обманывать: P

Ответ 3

Да, это приведет к бесконечному циклу, поскольку i был объявлен как char, который варьируется от от -128 до +127, поэтому он никогда не достигал 130

время i достигает 127, оно возвращается к -128 и никогда не достигает 130

http://ideone.com/iVLoHe

Ответ 4

char имеет длину 1 байта -2 ^ 8 до 2 ^ 8-1 (от -128 до 127), если вы попытаетесь добавить 1 к 127, это будет -128 произойдет переполнение. печатая переменную, вы увидите то же самое.

изменить объявление из         char я to int i

он никогда не заполняет стек, поскольку вы не объявляете новые переменные или вызывающие функции для заполнения стека. так что это только бесконечный цикл