argc가 'unsigned int'가 아닌 'int'인 이유는 무엇입니까?
명령 줄 인수가 변수 (전통적으로 "argc")가 'unsigned int'대신 'int'인 이유는 무엇입니까? 이에 대한 기술적 이유가 있습니까?
서명되지 않은 모든 비교 경고를 제거하려고 할 때 항상 무시했지만 왜 그런지 이해하지 못했습니다.
원래 C 언어가 기본적으로 모든 변수 또는 인수가 int 유형으로 정의 되었다는 사실 은 아마도 또 다른 요인 일 것입니다. 즉, 다음을 가질 수 있습니다.
main(argc, char* argv[]); /* see remark below... */
보다는
int main(int argc, char *argv[]);
편집 : 효과적으로 Aaron이 우리에게 상기 시켰 듯이, 원래 구문은 다음과 같을 것입니다.
main(argc, argv) char **argv {... }
"프로토 타입"은 나중에 소개 되었기 때문에. 모든 사람이 미묘한 (그다지 미묘하지 않은) 유형 관련 버그를 추적하면서 최소 10 시간 이상 기록한 후 대략적으로 발생했습니다.
몇 가지 이유 :
- 상관 없으니까
- C에는 원래
unsigned
키워드 또는 부호없는 정수 유형 이 없었기 때문에 - C는 원래 매개 변수 유형을 확인하지 않았고 프로토 타입도 없었기 때문입니다.
결과적int
으로 이것이 기본값이기 때문에 유형을 선언하지 않는 것이 일반적 이었습니다. - 그
int
당시에는 어떤 의미에서 더 중요 했기 때문 입니다. 모든 것이 정수였습니다. C는 유형이없는 언어에서 부분적으로 진화했습니다. 매 varable은이었다word
무엇이다,int
원래 사용되었다.
업데이트 : Jason S 가 소스를 요청했습니다. 나는 당신이 온라인 에있는 dmr 의 논문에서이 모든 것 ( "그것은 중요하지 않다"를 제외하고)을 파헤칠 수 있다고 생각한다 : The Development of the C Language . 일반적인 장소에서 이전 언어 BCPL 및 B를 찾아야 할 수도 있습니다.
C는 오래되었고 처음부터 그렇게 설계 되었기 때문입니다. 지금 변경하기에는 너무 늦었습니다.
다음 은 dmr 자신의 말로 된 C 프로그래밍 언어의 역사입니다. 명시 적으로 명시되어 있지는 않지만 (적어도 내가 제공 한 빠른 훑어보기에서는 아니지만) C의 초기 버전은 서명되지 않은 유형을 지원하지 않았습니다. 암시 적 타이핑에 대한 mjv의 요점 int
도 관련이 있습니다.
편집하다
Bell Labs 링크는 한동안 끊어졌습니다. 여기 같은 문서에 대한 대체 링크가 있습니다.
또 다른 이유는 서명되지 않은 유형이 반복에 불편할 수 있기 때문일 수 있습니다. 예를 들어이 스 니펫은 아래로 반복됩니다.
for (size_t i = SIZE - 1; i >= 0; --i)
...
사실은 버그입니다. 마지막 반복에서 0에 도달하면 4294967295 (32 비트 컴퓨터에서)로 바로 이동하고 루프가 종료되지 않습니다.
이런 이유로 필자는 개인적으로 일반 int가 반복에 더 편리하다는 것을 알았습니다. for
int를 사용할 때 루프를 카운트 업에서 카운트 다운으로 전환 할 때 특별히주의 할 필요가 없습니다 .
구글 C ++ 스타일 가이드는 사용 결코 알 수없는 unsigned int
실제 비트 패턴 타입의 않는있는 거 작업을. 그들의 근거는 C에도 적용됩니다. 빠른 요약 라인 :
... C의 유형 승격 체계는 서명되지 않은 유형이 예상과 다르게 작동하도록합니다. ... 서명되지 않은 유형을 사용하지 마십시오.
이것은 아마도 C의 원래 제작자의 마음에 없었을 것입니다.
경고 문제에 대한 해결책으로 다음과 같이 경고를 표시하지 않을 수 있습니다.
const unsigned int uargc = (unsigned int) argc;
Java에는 서명되지 않은 유형이 없기 때문에 앞으로 C 프로그램을 Java로 더 쉽게 이식 할 수 있도록 사전 설계 결정을 내 렸습니다.
에 대한 선언 main()
은 서명되지 않은 유형이 언어에 추가되기 전에 정의되었습니다 . ' 원시 C ' 의 DMR 페이지를 참조하십시오 . unsigned가 추가되었을 때 변경하기에는 너무 늦었습니다.
나는 그것이 어떻게 이상하게 보일 수 있는지 봅니다. argc
부정적 이어서 는 안됩니다! 그러나 봐,이 방법은 : 모두 int
와 unsigned int
수락 것 값의 범위를 커버 (당신이 2 ^ (31 개) 명령 줄 매개 변수가있는 경우, 당신은 문제가)와 int
입력 할 짧다.
인터뷰 퍼즐 질문 : unsigned
만약 C가 함께 갔다면 타이핑하는 데 얼마나 많은 키보드가 사용 되었을까요 unsigned int argc
?
int로 설정하면 범위가 1과 INT_MAX (포함) 사이로 제한됩니다. 이것은 일반적으로 우발적 인 캐스트 또는 별칭이 의도하지 않은 랩 어라운드로 인해 범위를 벗어나지 않는다는 것을 의미합니다. 또한 구현시 시스템 특정 시나리오에 대해 전체 음수 및 0 범위를 사용할 수 있습니다.
알겠습니다. 방금 구성했습니다. 진짜 이유는 원래 C 언어 개발자 중 한 명이 내린 임의의 결정일 뿐이고, 지금까지 그렇게 열심히 생각한 사람은 아무도 없었기 때문입니다. :)
간단한 질문입니다. 2 31 개 (또는 2 15 개 이상 )의 명령 줄 인수 를 예상하십니까 ? 대부분의 운영 체제가 그렇게 많은 것을 처리 할 수 있을지 의문입니다.
나는 그것이 C와 호환되도록 설계되었다고 가정하고 C 시대에는 사람들이 서명 / 부호없는 정확성에 대해별로 신경 쓰지 않았습니다.
참고 URL : https://stackoverflow.com/questions/1773897/why-is-argc-an-int-rather-than-an-unsigned-int
'programing' 카테고리의 다른 글
Eclipse의 문제보기에 대한 모범 사례 (0) | 2020.11.27 |
---|---|
MySQL : 많은 테이블 또는 많은 데이터베이스? (0) | 2020.11.27 |
데이터 프레임을 벡터로 변환 (행별) (0) | 2020.11.27 |
자바 스크립트를 사용하여 한 페이지에서 다른 페이지로 이동하는 방법은 무엇입니까? (0) | 2020.11.27 |
코드 및 리소스에서 TextView 글꼴 크기를 설정할 때 불일치 (0) | 2020.11.27 |