여기서 메인 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=c99
gcc에 접속합니다.
참고로 9가 반환되는 이유는 9가 반환되기 때문입니다.printf
9글자만 써놨어요.
의 반환값을 반환합니다.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
'sourcecode' 카테고리의 다른 글
vue-cli-service에서 빌드된 Vue 구성 요소를 가져올 수 없음 (0) | 2022.08.28 |
---|---|
v-for - VUE에서 어레이 항목을 제거하려면 인덱스를 하위 구성 요소에서 상위 구성 요소로 보냅니다.JS 2 (0) | 2022.08.28 |
Java Stanford NLP: 음성 라벨의 일부? (0) | 2022.08.28 |
라우터 매개 변수의 프로펠러 유형이 잘못되었습니다. 수에 문자열이 있어야 합니다. (0) | 2022.08.28 |
스택 트레이스를 문자열로 변환하려면 어떻게 해야 하나요? (0) | 2022.08.28 |