programing

argc가 'unsigned int'가 아닌 'int'인 이유는 무엇입니까?

nasanasas 2020. 11. 27. 08:12
반응형

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가 반복에 더 편리하다는 것을 알았습니다. forint를 사용할 때 루프를 카운트 업에서 카운트 다운으로 전환 할 때 특별히주의 할 필요가 없습니다 .


구글 C ++ 스타일 가이드는 사용 결코 알 수없는 unsigned int실제 비트 패턴 타입의 않는있는 거 작업을. 그들의 근거는 C에도 적용됩니다. 빠른 요약 라인 :

... C의 유형 승격 체계는 서명되지 않은 유형이 예상과 다르게 작동하도록합니다. ... 서명되지 않은 유형을 사용하지 마십시오.

이것은 아마도 C의 원래 제작자의 마음에 없었을 것입니다.


경고 문제에 대한 해결책으로 다음과 같이 경고를 표시하지 않을 수 있습니다.

const unsigned int uargc = (unsigned int) argc;

Java에는 서명되지 않은 유형이 없기 때문에 앞으로 C 프로그램을 Java로 더 쉽게 이식 할 수 있도록 사전 설계 결정을 내 렸습니다.


에 대한 선언 main()은 서명되지 않은 유형이 언어에 추가되기 전에 정의되었습니다 . ' 원시 C ' 의 DMR 페이지를 참조하십시오 . unsigned가 추가되었을 때 변경하기에는 너무 늦었습니다.


나는 그것이 어떻게 이상하게 보일 수 있는지 봅니다. argc부정적 이어서 는 안됩니다! 그러나 봐,이 방법은 : 모두 intunsigned 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

반응형