programing

왜 argc가 'int'('부호화되지 않은 int'가 아닌)

prostudy 2022. 5. 22. 11:23
반응형

왜 argc가 'int'('부호화되지 않은 int'가 아닌)

명령줄 인수 카운트 변수(일반적으로)인 이유argc) anintunsigned int이것에 대한 기술적 이유가 있는가?

나는 내가 서명하지 않은 비교 경고를 모두 없애려고 할 때 항상 그것을 무시해왔지만, 그것이 왜 그런 것인지 결코 이해하지 못했다.

원래 C 언어가 기본적으로 어떤 변수나 인수가 유형 int로 정의되어 있다는 사실은 아마도 또 다른 요인일 것이다.다른 말로 하면 다음과 같은 효과를 얻을 수 있다.

  main(argc, char* argv[]);  /* see remark below... */

보다는

int main(int argc, char *argv[]);

편집: 효과적으로, 애런이 우리에게 상기시켰듯이, 매우 독창적인 구문은 다음과 같은 것이었을 것이다.

  main(argc, argv) char **argv {... } 

"프로토타입"은 나중에야 도입되었기 때문이다.그것은 모든 사람들이 최소 10시간 이상 로그에 기록하여 미묘한(그리고 그다지 미묘하지 않은) 유형의 버그를 추적한 후 대략적으로 이루어졌다.

몇 가지 이유:

  • 중요하지 않기 때문에
  • 왜냐하면 C가 원래 가지고 있지 않았기 때문이다.unsigned키워드 또는 서명되지 않은 정수 유형
  • 왜냐하면 C는 원래 파라미터 타입을 확인하지 않았고 프로토타입도 가지고 있지 않았기 때문이다.
    그 결과 신고조차 하지 않는 것이 일반적인 관행이었다.int유형(기본값)
  • 때문에int어떤 면에서는, 그 당시가 더 중요했다.모든 것이 int였다.C는 부분적으로 유형도 없는 언어에서 진화했다.모든 경쟁자들은word, 그것이 무엇이다.int원래는 …을 위해 사용되었다.

업데이트: Jason S가 출처를 물었다.나는 당신이 이 모든 것을 ("상관없음"을 제외한) 신문에서 온라인에 있는 dmr로 파낼 수 있다고 생각한다.C언어의 발전.당신은 일반적인 장소에서 이전의 언어 BCPL과 B를 찾아볼 필요가 있을 것이다.

또 다른 이유는 서명되지 않은 형식이 반복에 불편할 수 있기 때문일 수 있다.예를 들어, 이 단편적인 반복:

for (size_t i = SIZE - 1; i >= 0; --i)
  ...

사실 벌레지.내가 마지막 반복에서 0에 도달하면, 그것은 바로 4294967295(32비트 머신에서)로 진행될 것이고 루프는 종료되지 않을 것이다.

이러한 이유로, 나는 개인적으로 반복에 더 편하다고 생각한다.a를 전환할 때 특별히 주의할 필요는 없다.forint를 사용할 때 카운트업에서 카운트다운으로 반복한다.

여기 dmr의 말로 된 c 프로그래밍 언어의 역사가 있다.명시적으로 명시되어 있지 않지만(적어도 내가 준 빠른 스킴에서 나온 것은 아니다), C의 초기 버전은 서명되지 않은 유형을 지원하지 않았다.mjv의 암묵적 타이핑에 대한 요점int또한 관련이 있다.

편집

Bell Labs 링크는 잠시 고장났다. 여기 같은 종이에 대한 대체 링크가 있다.

나는 그것이 C와 호환되도록 설계되었다고 생각한다. 그리고 C 시간에는 사람들은 서명/서명되지 않은 정확성에 별로 관심이 없었다.

간단한 질문:명령행 인수가31 2개 이상(또는15 2개 이상)으로 예상하십니까?나는 대부분의 운영체제가 그렇게 많은 것을 처리할 수 있을지 의심스럽다.

왜냐하면 C는 오래되었고 처음부터 그렇게 설계되었기 때문이다.지금 바꾸기에는 너무 늦었다.

Google C++ 스타일 가이드는 사용하지 말 것을 제안한다.unsigned int실제 비트 패턴을 사용하지 않는 경우 유형.그들의 근거는 C에도 적용된다.빠른 요약 줄:

…C의 형식촉진 계획은 서명되지 않은 타입이 예상과 다르게 행동하게 한다…….서명되지 않은 유형은 사용하지 마십시오.

이것은 아마도 C의 원작자의 마음에 있는 것이 아니라 누가 알고 있었는지도 모를까?

경고 문제에 대한 해결책으로 다음과 같은 경고를 억제할 수 있다.

const unsigned int uargc = (unsigned int) argc;

자바에는 서명되지 않은 유형이 없기 때문에 향후 자바에 C 프로그램을 쉽게 포팅할 수 있도록 하기 위한 사전 설계 결정이었다.

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

어떻게 이상하게 보일지 알겠다argc부정적이면 안 된다!하지만 이런 식으로 봐, 둘 다int그리고unsigned int허용 가능한 값의 범위(명령줄 매개변수가 2^31인 경우 문제가 있음) 및int활자보다 짧다.

인터뷰 퍼즐 질문: 키보드를 몇 개나 입력했을까?unsignedC가 함께 갔더라면unsigned int argc?

int로 설정함으로써, 범위는 1에서 INT_MAX까지로 제한된다.이것은 일반적으로 어떤 우발적인 주조물이나 가명도 부주의하게 감싸는 것에서부터 범위를 벗어나지 않는다는 것을 의미한다.또한 구현은 시스템 특정 시나리오에 대해 전체 음과 0 범위를 사용할 수 있다.

그래, 내가 방금 지어냈어.진짜 이유는 원래 C언어 개발자 중 한 명이 내린 자의적인 결정일 뿐 지금까지 누구도 그렇게 어렵게 생각하지 않았기 때문이다.:)

참조URL: https://stackoverflow.com/questions/1773897/why-is-argc-an-int-rather-than-an-unsigned-int

반응형