Будет ли этот цикл работать бесконечно?
Я сижу в классе, и мне очень опытный учитель сказал, что следующий код завершится, когда STACK memory
будет полностью заполнен программой. Теперь я не могу понять, почему? Ниже приведен исходный код: -
#include<stdio.h>
int main()
{
char i;
for (i = 120; i < 130; i++)
printf("\n%d", i);
return 0;
}
Теперь причина, по которой я чувствую, что этот цикл не завершится, заключается в том, что, как только программа запускается, переменная объявляется в одной ячейке памяти, которая не изменяется до срока действия программы, и мы меняем значение уже объявленная переменная. Поэтому я хотел задать ответ на этот вопрос. Кроме того, если вы считаете, что учитель прав, объясните также:)
Кроме того, я пытался запустить программу в течение длительного времени, но потребление памяти не увеличилось даже немного: |
Ответы
Ответ 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
он никогда не заполняет стек, поскольку вы не объявляете новые переменные или вызывающие функции для заполнения стека. так что это только бесконечный цикл