sourcecode

여기서 메인 0이 반환되지 않는 이유는 무엇입니까?

copyscript 2022. 8. 28. 09:52
반응형

여기서 메인 0이 반환되지 않는 이유는 무엇입니까?

그냥 책을 읽고 있었어요.

ISO/IEC 9899:201x 위원회 초안 - 2011년 4월 12일

5.1.2.2.3 프로그램 종료에 따라 찾은 경우

..reaching the } that terminates the main function returns a value of 0. 

반환문을 지정하지 않은 경우main()프로그램이 정상적으로 실행되면 main의 closing brase}에서 0이 반환됩니다.

그러나 다음 코드에서는 반환문을 지정하지 않았지만 0을 반환하지 않습니다.

#include<stdio.h>
int sum(int a,int b)
{
return (a + b);
}

int main()
{
    int a=10;
    int b=5;
    int ans;    
    ans=sum(a,b);
    printf("sum is %d",ans);
}

컴파일하다

gcc test.c  
./a.out
sum is 15
echo $?
9          // here it should be 0 but it shows 9 why?

이 규칙은 1999년 버전의 C 표준에 추가되었습니다.C90에서는 반환된 상태는 정의되어 있지 않습니다.

패스하면 유효하게 할 수 있습니다.-std=c99gcc에 접속합니다.

참고로 9가 반환되는 이유는 9가 반환되기 때문입니다.printf9글자만 써놨어요.

의 반환값을 반환합니다.printf정말 출력된 글자 수입니다.

함수로부터의 반환값은 보통 CPU의 eax 레지스터에 저장되므로 "return 4;"라는 문장은 보통 다음과 같이 컴파일됩니다.

mov eax, 4;
ret;

(컴파일러에 따라) x를 반환하는 방법은 다음과 같습니다.

mov eax, [ebp + 4];
ret;

반환값을 지정하지 않으면 컴파일러는 "ret"을 계속 뱉지만 eax 값은 변경되지 않습니다.따라서 발신자는 이전에 eax 레지스터에 남아 있던 것이 반환값이라고 생각합니다.이 예에서는 보통 return value printf 가 됩니다만, 컴파일러마다 다른 머신 코드가 생성되어 일부 레지스터가 다르게 사용됩니다.

이것은 간단한 설명입니다.다양한 호출 규칙과 타깃플랫폼이 중요한 역할을 합니다만, 이 예에서 '배후'가 발생하고 있는 상황을 설명하기에 충분한 정보가 됩니다.

어셈블러에 대한 기본적인 지식이 있다면 다른 컴파일러의 디스어셈블리를 비교해 볼 필요가 있습니다.일부 컴파일러는 eax 레지스터를 지우는 것을 방지할 수 있습니다.

언급URL : https://stackoverflow.com/questions/8677672/why-main-does-not-return-0-here

반응형