>  기사  >  백엔드 개발  >  C에서 `main()`을 재귀적으로 호출하는 것이 허용됩니까?

C에서 `main()`을 재귀적으로 호출하는 것이 허용됩니까?

Linda Hamilton
Linda Hamilton원래의
2024-11-01 07:03:01583검색

Is Recursively Calling `main()` in C   Allowed?

C에서 main()을 재귀적으로 호출할 수 있습니까?

아래 코드 조각은 C에서 main()을 재귀적으로 호출하는 흥미로운 동작을 보여줍니다. .

<code class="cpp">#include <iostream>
#include <cstdlib>

int main() {
    std::cout << "!!!Hello World!!!" << std::endl;
    system("pause");
    return main();
}</code>

코드가 성공적으로 컴파일되고 실행되면 "Hello World!!!"가 표시됩니다. 무기한. 그러나 이 동작은 C의 표준을 준수하지 않는다는 점에 유의하는 것이 중요합니다. C 표준에서는 main()을 반복적으로 호출하거나 해당 주소를 가져오는 것을 명시적으로 금지합니다.

그러나 실제로 Linux g 컴파일러와 같은 일부 컴파일러에서는 main()에서 main()이 호출되는 것을 허용합니다. 이러한 허용성은 다음 코드에서 분명하게 나타납니다.

<code class="cpp">#include <cstdlib>
#include <iostream>
using namespace std;
int main()
{
    int y = rand() % 10;
    cout << "y = " << y << endl;
    return (y == 7) ? 0 : main();
}</code>

이 코드가 실행되면 일련의 "y" 값(예: 3, 6, 7)이 생성됩니다. 각 값은 main()에 대한 후속 호출에서 생성됩니다. .

컴파일된 어셈블리를 분석하면 main()이 다른 함수와 마찬가지로 호출된다는 사실이 드러납니다.

<code class="assembly">main:
...
cmpl    , -12(%rbp)
je      .L7
call    main
...
.L7:
...
leave
ret</code>

표준의 금지에도 불구하고 g는 이러한 호출을 허용하는 것 같습니다. 그러나 이 동작은 보장되지 않으며 프로그래머는 이식성과 C 표준 준수를 보장하기 위해 이에 의존하지 않아야 합니다.

위 내용은 C에서 `main()`을 재귀적으로 호출하는 것이 허용됩니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.