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

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

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

4b9b3361

Ответ 1

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

Ответ 2

Действительно разрешено вызывать 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/Если требование "должно" или "не должно", которое появляется за пределами ограничения или ограничения времени выполнения, нарушено, поведение undefined. Undefined поведение в этом международном стандарте указано иначе словами "undefined поведение" или отсутствием какого-либо явного определения поведения. В этих трех различиях нет разницы; все они описывают "поведение, которое undefined".

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() помимо исходного/оригинального.

Ответ 3

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

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

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

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

Ответ 4

Да, вы можете. Простая программа:

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

Объяснение:

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

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

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

Ответ 5

Да, можно вызвать main() внутри main() в 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() 
}

В С++:

#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

* здесь ключевое слово статическое используется в качестве базовой проверки для завершения программы, иначе 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(). Таким образом, рекурсия заканчивается, я 'становится равным 6 как return 0; выполняется.

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

Ответ 6

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

Ответ 7

int static val;
main()
{ 
  if(val==0)
  { clrscr(); }
  while(val<3)
  { val++; 
    printf("calld main\n",main());
  } 
getch();
}

Ответ 8

Да, можно сделать главную функцию рекурсивной функцией как в 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;
}

для С++,

#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;
}

Ответ 9

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