왜 main이 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.
는에 return 문을 지정하지 않으면 main()
프로그램이 성공적으로 실행되면 main의 닫는 중괄호}에서 0을 반환합니다.
그러나 다음 코드에서는 return 문을 지정하지 않지만 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=c99
gcc 로 전달 하여 활성화 할 수 있습니다 .
부수적으로, 흥미롭게도 9는 printf
단지 9 문자를 쓴 반환이기 때문에 반환 됩니다.
printf
실제로 인쇄 된 문자 수인 반환 값을 반환합니다 .
함수의 반환 값은 일반적으로 CPU의 eax 레지스터에 저장되므로 "return 4;" 보통 컴파일
mov eax, 4;
ret;
(컴파일러에 따라) x를 반환하면 다음과 같습니다.
mov eax, [ebp + 4];
ret;
반환 값을 지정하지 않으면 컴파일러는 여전히 "ret"을 뱉어 내지 만 eax의 값은 변경하지 않습니다. 따라서 호출자는 이전에 eax 레지스터에 남은 것이 반환 값이라고 생각할 것입니다. 이 예제에서는 일반적으로 반환 값 printf가되지만 다른 컴파일러는 다른 머신 코드를 생성하고 일부 레지스터를 다르게 사용합니다.
이것은 간단한 설명이며, 다른 호출 규칙과 대상 플랫폼이 중요한 역할을 수행하지만 예제에서 '뒤에서'발생하는 상황을 설명하는 데 충분한 정보가 있어야합니다.
어셈블러에 대한 기본 지식이 있다면 다른 컴파일러의 디스 어셈블리를 비교할 가치가 있습니다. 일부 컴파일러는 보호 수단으로 eax 레지스터를 지우고 있음을 알 수 있습니다.
참고 URL : https://stackoverflow.com/questions/8677672/why-main-does-not-return-0-here
'programing tip' 카테고리의 다른 글
AndroidX로 마이그레이션 할 때 변수 '$ {animal.sniffer.version}'을 (를) 해결하지 못했습니다. (0) | 2020.07.20 |
---|---|
여러 로더가있는 LoaderManager : 올바른 커서 로더를 얻는 방법 (0) | 2020.07.20 |
awk로 수정 사항 저장 (0) | 2020.07.19 |
의사 요소 내용 앞에 :: after 또는 ::에 줄 바꿈 추가 (0) | 2020.07.19 |
Vim Regex 캡처 그룹 [bau-> byau : ceu-> cyeu] (0) | 2020.07.19 |