왜 main이 int 또는 void가 아닌 double 또는 String을 반환 할 수 없습니까?


38

같은 C, C ++ 및 Java는 많은 언어에서 main방법 / 함수의 반환 형식이 void또는 int아니라, doubleString. 그 이유는 무엇입니까?

나는 때문에 우리가 할 수없는 것을 조금 알고 main런타임 라이브러리에 의해 호출되어 있으며 일부 구문처럼 기대 int main()또는 int main(int,char**)우리가에 충실 할 수 있도록.

그래서 내 질문은 : 왜 main형식 서명이 있고 다른 서명이 없습니까?


15
이중 반환 값 무엇을 의미 합니까? 문자열 반환 값 무엇을 의미 합니까?

1
ki는 아무 의미가 없다는 것을 이해합니다. 그러나 다른 이유와 규칙은 무엇입니까?
JAVA

1
나는 보편적으로 정상적인 종료의 경우 0과 비정상의 경우 0이 아닌 것을 선택했기 때문에 아무것도 의미하지 않는다고 생각합니다 .int는 광범위한 크로스 언어 호환성을 가진 가장 간단한 데이터 유형으로 선택되었습니다. @ delnan
JAVA

@sunny 유닉스 계열 OS에 대한 경험에서 수집 한 것에서 0은 다른 정수 값과 비교할 때 모호하지 않기 때문에 "정상 종료"(0 오류)로 사용됩니다. 대부분의 현대 언어는 C와 비슷하게 설계되었지만 C가 유닉스를 쓰는 데 사용 되었기 때문에 KnR의 역사적 결정이었습니다.
Jamie Taylor

3
@sunny "광범위한 언어 호환성"은 문제가되지 않았습니다. C와 UNIX는 함께 작성되었습니다. 다른 많은 언어가 int를 반환하는 이유는 UNIX 또는 UNIX와 유사한 환경에서 작동하도록 설계 되었기 때문입니다.

답변:


83

의 반환 값은 단일하고 일관된 방식으로 main운영 체제 ( 모든 운영 체제) 로 전달됩니다 . 운영 체제가 알아야 할 정보는 "프로그램이 성공적으로 종료되었거나 오류가 있습니까?"입니다.

이것이 문자열이면 다른 언어로 응답하기가 어렵습니다. Pascal 문자열 (첫 번째 바이트 길이)과 FORTRAN 문자열 (고정, 일부 값으로 채워짐) 및 C 문자열 (널로 종료 됨)의 내부는 모두 다릅니다. 이것은 운영 체제에 일관된 가치를 돌려주는 것을 어렵게 만듭니다. 이것이 해결되었다고 가정하면 OS가 프로그램에 대해 가진 질문에 대답하기 위해 무엇을 하시겠습니까? 문자열 비교는 오류 ( "성공"대 "성공")로 가득 차 있으며 오류는 사람에게 더 유용 할 수 있지만 운영 체제 또는 다른 프로그램 (쉘)이 처리하기가 더 어렵습니다. 문자열 자체에서도 EBCDIC (모든 코드 페이지가있는)와 ASCII의 차이가 상당히 컸습니다 .

Floats 및 Doubles는 데이터를 OS (및 셸)로 다시 통신하기 위해 정수보다 추가 값을 제공하지 않습니다. 대부분의 경우 컴퓨터의이 부분 중 어느 것도 부동 소수점 숫자를 다루지 않습니다. 복식은 열거하기가 어렵 기 때문에 비교가 어렵습니다. 열거 할 수는 없지만 오류가 무엇인지보고합니다 (성공을 위해 특정 값을 선택했다고 가정). 다시 말하지만, 부동 소수점은 일관성이 없습니다. 8 비트 시스템의 부동 소수점은 16 비트 및 32 비트 시스템의 부동 소수점과 다릅니다 (그리고 이는 '정상적인 것'임)-IBM 내에서도 부동 소수점은 표준화되지 않았습니다 같은 제조업체에서 1980 년대까지 기계 간). 그리고 십진 대 이진 컴퓨터가 있습니다. 부동 소수점 값은 일관성이 없으며 의미있는 데이터를 다시 제공하지 않습니다.

그것은 실제로 옵션으로 바이트와 정수를 남겨 둡니다. 확립 된 컨벤션은 '0'이었고 다른 것은 오류였습니다. 정수는 오류를보고하기위한 바이트보다 많은 공간을 제공합니다. 열거 가능 (1의 리턴은 XYZ, 2의 리턴은 ABC, 3의 리턴, DEF 등을 의미 함) 또는 플래그로 사용될 수 있습니다 ( 0x0001이는 실패, 0x0002실패한 것, 실패한 0x0003것을 의미 함). 이것을 바이트로 제한하면 플래그가 쉽게 없어 질 수 있으므로 (8 개만), 정수를 사용하기로 결정했을 것입니다.


2
나는 main이 c / c ++ 런타임 라이브러리에 의해 os 호출하기 전에 호출된다고 생각합니다. 이것은 코드와 함께로드되고 os @ MichaelT에 의해 호출됩니다
JAVA

5
main()다른 운영 체제에서 다른 방법으로 호출됩니다. C에서 main () 메소드는 처음에 어떻게 호출됩니까? 이것에 들어갑니다.

22
이해해야 할 점은 main다른 프로그램과는 달리 프로그래머가 정의한 프로토콜의 일부가 아니라 호스트 (OS)와 인터페이스하는 데 사용되는 프로토콜이라는 것입니다. 당신이 그것을 선택하지 않았기 때문에 당신은 그것을 선택할 수 없습니다. 보다 실용적인 수준에서, UNIX는 프로세스에 의해 int가 리턴 될 것으로 예상하므로 C-to-UNIX 프로토콜이이를 정확하게 수행합니다. 인수 전달에 대해 유사한 인수를 만들 수 있습니다. 숫자 만 인수로 전달한 OS / 호스트에 대해 C를 발명 한 경우 (예 : 명령 줄 없음) 인수는 문자열 대신 정수입니다.
Euro Micelli 2016 년

2
IBM은 코드 페이지 개념을 EBCDIC에서 PC로 가져 왔습니다. 7 비트 ASCII 는 코드 페이지가 없지만 8 비트 문자 코드는 설정에 따라 단일 컴퓨터에서도 여러 가지 방식으로 해석 될 수 있습니다. -멀티 바이트 인코딩을위한 코드 페이지는 물론입니다. 따라서 실제로 두 번째 단락의 마지막 문장에서 언급 한 것보다 훨씬 나쁩니다 .
CVn

@EuroMicelli 그것은 정말 좋은 정보입니다. 정말 감사합니다 :)
JAVA

27

음, 할 수 있었다 .

예를 들어, Plan 9 운영 체제 에서 사용되는 C의 방언에서 main일반적으로 void함수 로 선언 되지만 함수에 문자열 포인터를 전달하여 종료 상태가 호출 환경으로 리턴됩니다 exits(). 빈 문자열은 성공을 나타내고 비어 있지 않은 문자열은 일종의 실패를 나타냅니다. 이것은 함으로써 구현 된 main반환 char*결과입니다.

그리고 종료 float또는 double종료 상태 의 시스템을 구현하는 것이 가능할 것 입니다.

int? 이는 컨벤션의 문제 일뿐입니다. 운영 체제와 그 아래에서 실행되는 프로그램은 공통 컨벤션을 준수하는 데 엄청난 가치가 있습니다.

유닉스 관례는 성공을 나타내는 0과 0이 아닌 것을 나타내는 정수 상태 코드를 사용하는 것입니다 (일반적으로 성공하는 방법은 하나 뿐이지 만 여러 가지 실패 방법이 있기 때문에). 나는 그 협약이 유닉스에서 유래 한 것인지 모른다. 이전 운영 체제에서 나온 것으로 의심됩니다.

(a) 부동 소수점 지원이 보편적이지 않고, (b) 부동 소수점 값과 오류 조건 사이의 매핑을 정의하기가 더 어렵 기 때문에 부동 소수점은 더 어려운 규칙이 될 수 있습니다. 포인트 표현 및 (d) 프로그램 종료 상태에서 반올림 오류를 추적하는 재미를 상상해보십시오. 반면 정수는 오류 코드를 열거하는 데 매우 적합합니다.

앞서 언급했듯이 Plan 9는 문자열을 사용하지만 메모리 관리, 문자 인코딩 등에 약간의 복잡성을 부과합니다. 내가 아는 한, Plan 9가 그것을 구현했을 때 새로운 아이디어였으며 기존의 것을 대체하지 않았습니다. 광범위한 협약.

(실수로 C ++ 에서는을 반환 main할 수 있으며 C 에서는 컴파일러가 특별히 지원하는 경우에만 허용됩니다. 많은 컴파일러는 작성해도 크게 크게 불평하지 않지만 잘못되었다고 말하는 것은 약간 과장된 입니다.)intvoid mainvoid main


9

main 메소드에 의해 리턴되는 값은 "종료 코드"입니다. 호출 프로그램 (보통 bash)에서 프로그램이 예상대로 종료되었는지 테스트하는 데 사용됩니다. OS 레벨에서 정수를 리턴하는 것이 가장 쉬운 방법입니다. Double은 오류 코드에 의미가 없으며 문자열은 OS 수준에서 유지 관리하기가 어렵습니다 (GC가 없음).


3
정수가 아닌 문자열을 가비지 수집해야하는 이유는 무엇입니까?
Brad

4
@Brad, 문자열은 길이가 가변적이며 본질적으로 한 문자이거나 수천이 될 수있는 배열을 다시 전달하는 것과 같습니다. 동적 메모리는 고통 스러울 수 있지만 int는 다루기가 어렵지 않은 고정 크기입니다.
JB King
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.