вызов main () в main () в c - PullRequest
       21

вызов main () в main () в c

25 голосов
/ 21 ноября 2010

Можно ли вызвать main() в функции main() в c?

Ответы [ 9 ]

27 голосов
/ 21 ноября 2010

Да, C позволяет вам вызывать вашу основную функцию (тогда как C ++ не )

12 голосов
/ 18 августа 2015

Действительно допустимо вызывать main() из самого себя, даже избегая переполнения стека тем же методом, который используется для любого другого рекурсивного кода, условие завершения, такое как:

#include <stdio.h>
int main (int argc, char *argv[]) {
    printf ("Running main with argc = %d, last = '%s'\n",
        argc, argv[argc-1]);
    if (argc > 1)
        return main(argc - 1, argv);
    return 0;
}

который при запуске как testprog 1 2 3 выдает:

Running main with argc = 4, last = '3'
Running main with argc = 3, last = '2'
Running main with argc = 2, last = '1'
Running main with argc = 1, last = 'testprog'

Однако, поскольку это только неподтвержденное свидетельство, мы должны обратиться к стандарту. Раздел ISO C11 4 Conformance гласит:

1 / В настоящем международном стандарте «должен» толковаться как требование к реализации или программе; и наоборот, «не должен» должен толковаться как запрет.

2 / Если требование «должен» или «не будет», которое появляется вне ограничения или ограничения времени выполнения, нарушается, поведение не определено. Неопределенное поведение иначе обозначено в этом международном стандарте словами «неопределенное поведение» или пропуском любого явного определения поведения. Нет разницы в акценте между этими тремя; все они описывают «поведение, которое не определено».

3 / Программа, корректная во всех других аспектах, работающая с правильными данными, содержащая неопределенное поведение, должна быть правильной программой и действовать в соответствии с 5.1.2.3.

Теперь, поскольку нигде в стандарте нет явного запрета в стандарте main(), вызывающем себя, пункт 3 выше является контролирующим аспектом.

Дальнейшую поддержку можно увидеть в двух местах (выделено жирным шрифтом), сначала в разделе 5.1.2.2.3 Program termination:

1 / Если тип возврата функции main является типом, совместимым с int, возврат из начального вызова функции main эквивалентен к вызову функции exit со значением, возвращаемым функцией main в качестве аргумента;

А потом в разделе 7.21.3 Files:

5 / Файл может быть впоследствии повторно открыт при том же или другом выполнении программы, а его содержимое восстановлено или изменено (если его можно изменить в начале). Если функция main возвращается к своему исходному абоненту или если вызывается функция exit, все открытые файлы закрываются (следовательно, все выходные потоки сбрасываются) до завершения программы .

Оба этих подраздела поддерживают возможность того, что другие звонки на main() могут превышать исходный / оригинальный.

5 голосов
/ 21 ноября 2010

Да, мы можем вызвать main () внутри функции main ().

Процесс вызова функции самой функцией известен как Рекурсия.

Хорошо, вы можете вызвать main () внутри функции main (), но у вас должно быть условие, которое не вызывает функцию main () для завершения программы.

В противном случае программа никогда не вернется и будет работать бесконечно.

2 голосов
/ 07 октября 2017

Да , есть возможность вызвать main () внутри main () как на C, так и на C ++.Это концепция «рекурсии», когда функция вызывает себя. Например:

В C:

#include<stdio.h>
int main()
{
    static int i=1;  // *
    printf("%d\n",i++);
    if(i==6)
    {
        return 0;
    }
    main(); // recursive call of main() 
}

В C ++:

#include<iostream>
using namespace std;
int main()
{
    static int i=1;  // *
    cout<<i<<endl;
    i++;
    if(i==6)
    {
        return 0;
    }
    main(); // recursive call of main() 
}

ВЫХОД обеих программ:

1
2
3
4
5

* здесь, статический *Ключевое слово 1025 * используется в качестве базовой проверки для завершения программы, в противном случае main () будет продолжать вызывать себя бесконечно.Например,

1
1
1
1
1
1
1
1
1
1
1.. program ends abnormally.

Здесь main () вызывает себя бесконечно, потому что новое целое число 'i' создается каждый раз в новом main () с начальным значением 1 , если мыне используйте ключевое слово static .Таким образом,

if(i==6)

истинно в каждом main (), вызываемом рекурсивно, и программа никогда не завершается нормально.

Но использование статического ключевого слова создает целое число «i» только один раз (когда main () выполняется впервые), а значение «i» увеличивается во время каждого рекурсивного вызова main (). Таким образом, рекурсиязаканчивается, когда 'i' становится 6, когда return 0; выполняется.

Дополнительная информация.о статическом ключевом слове: рекурсивная функция со статической переменной

2 голосов
/ 07 февраля 2016

Да, вы можете .

Простая программа:

int main()
{
    printf("Anything");
    main();
    return 0;
}

Пояснение:

A call stack или function stack используется для нескольких связанных целей, но главная причина его наличия - отслеживать точку, которой каждая активная подпрограмма должна вернуть управление после завершения выполнения.

A stack overflow возникает, когда в стеке вызовов используется слишком много памяти.

Здесь функция main() вызывается повторно, а ее адрес возврата сохраняется в стеке. После заполнения стека память заполнена. Показывает stack overflow error.

0 голосов
/ 03 июля 2019

да, функцию main можно вызывать сама по себе.Это рекурсивная функция, но на бесконечное время (пока не произойдет переполнение стека). пример кода

0 голосов
/ 23 февраля 2017

Это зависит от того, какой компилятор вы используете, я написал программу на c, чтобы найти сумму натуральных чисел без использования каких-либо функций или просто помочь в написании функции MAIN внутри функции MAIN (я использовал condn для завершения), которая у нее есть nt дал мой ответ req в компиляторе turbo c, но в devc ++ он позволил мне скомпилировать программу и дал вывод req.

0 голосов
/ 01 октября 2016
int static val;
main()
{ 
  if(val==0)
  { clrscr(); }
  while(val<3)
  { val++; 
    printf("calld main\n",main());
  } 
getch();
}
0 голосов
/ 08 декабря 2015

Да, можно сделать функцию main рекурсивной как в C, так и в C ++.Я проверил это, представив проблему UVa (№ 10071), и он принял.Вот код: Снимок экрана 1 , Снимок экрана 2

#include<stdio.h>
int main(void)
{
    int v,t,s;
    if(scanf("%d%d",&v,&t)==2)
    {
        s=2*(v*t);
        printf("%d\n",s);
        main();
    }
    else
        return 0;
}

для C ++,

#include<iostream>
using namespace std;
int main(void)
{
    int v,t,s;
    if(cin>>v>>t)
    {
        cout<<2*v*t<<endl;
        main();
    }
    else
        return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...