Почему следующий код не заканчивается вообще?Почему следующий код не заканчивается?
int main()
{
printf("Hello world\n");
main("hello",32);
return 0;
}
Почему следующий код не заканчивается вообще?Почему следующий код не заканчивается?
int main()
{
printf("Hello world\n");
main("hello",32);
return 0;
}
Существует рекурсивный вызов функции main()
(по линии 4 в коде), что приводит к неограниченному рекурсии.
Но есть только один вызов: –
main() вызывает сам себя и является неограниченной рекурсией. Вы можете изучить рекурсию, чтобы понять, что происходит. – codeforester
@Anurag Читайте о рекурсивных вызовах функций.Когда «main» вызывается в первый раз, он вызывает вызов для других «основных» и так далее. –
Приведенный выше код дает ошибки компиляции. Правильный код может быть -
int main()
{
printf("Hello world");
main();
return 0;
}
Это происходит в бесконечном цикле, потому что «основные» рекурсивен, называющие себя, и нет никаких условий терминатора.
Код генерирует ошибку компиляции «Дополнительный параметр при вызове главного» , если он запущен без какого-либо параметра в главном, то это будет рекурсивный вызов для основной функции, поэтому он не прерывается.
Ваш код никогда не достигнет инструкции return 0;
... потому что функция main
вызовет себя до этого. Во второй раз, когда код запускается, он снова вызовет себя, а затем, когда main
будет запущен снова, он вызовет себя перед достижением оператора возврата ... Это будет продолжаться вечно.
ОК, есть две вещи здесь:
Стандарт говорит, что есть только два пути, чтобы написать main
: int main(void) {}
и int main(int argc, char* argv[]) {}
. Вы не используете ни одного из них, что делает
main
функция принимает не указано количество аргументов. И таким образом вы должны не ожидать, что ваша функция main
не принимает никаких аргументов.
В результате второй точки, даже это было бы скомпилировать и запустить:
int main()
{
printf("Hello world\n");
main("hellow",32, "cow", 3.14);
return 0;
}
Запись int main(void)
и посмотреть, что компилятор должен сказать о рекурсивном вызове. HTH.
Правильно ли компилируется ваш код? –
да это скомпилировано. –
Рассмотрим утверждение 'printf («Hello World \»)'. Окончательные двойные кавычки отсутствуют. Когда вы используете символ «\», символ, следующий за ним, не используется в обычном смысле (также называемый escape-последовательность). Более того, вы не должны передавать какие-либо аргументы в «main» –