0 기반 월 번호 매기기 [닫기]


98

일부 인기있는 프로그래밍 언어는 월 번호 매기기를 사용합니다. 이는 1에서 벗어난 월 번호를 사용합니다. 자바와 마찬가지로 자바 스크립트가 떠오르며 메모리가 사용되는 경우 C는 다른 것입니다. 질문이 몇 개 있습니다:

  • 평신도들이 사용하는 월 번호를 무시하려면 일관성을 위해 그날 도 무시하지 않는 이유는 무엇입니까? 평신도가 사용 번호를 매월 0부터 시작 번호를 지정 무엇입니까?
  • 왜 그렇게 흔한가요?
  • 처음에 이것은 누구의 생각 이었습니까?

배열, 0에서 시작하고 사람들은 숫자로 일을 참조합니까?
glasnt

13
@TomatoSandwich : 꽤 자주 사람들은 을 숫자로 언급하며 1 부터 시작 합니다.
Robert L

2
그런데 API 프로그래머는 신이 아닙니다. 때때로 실수가 구현에 들어갑니다. 그냥 처리하세요. 이것이 정확한 경우는 아니지만 (어떤 언어를 말하지도 않음) 모든 것이 완벽 할 것이라고 기대하지는 마십시오. 나는 그 이유를 알고 싶어서 감탄한다.
Noon Silk

5
일본에서는 숫자 만 사용합니다. 그들은 1 월, 2 월 등을 사용하지 않습니다. 서구 세계에서도 숫자를 자주 사용합니다. 나는 그들이 구어 스타일보다 배열 스타일을 선택하는 다른 프로그래밍 언어를 다시는 만들지 않기를 바랍니다. 수백만 번 사용할 무언가에 대한 간단한 수정입니다.
Wolfpack'08

1
동의합니다. 교수형 위반은 아니지만이 작업을 수행 한 사람은 내 시간을 10 분만 낭비하고 중간 크기의 젖은 물고기를 때릴 자격이 있습니다.
James McCormack 2014

답변:


53

계산을 시작하기 위해 0을 사용하는 것은 실제로 어셈블리 프로그래머의 최적화 트릭입니다. 카운트 레지스터에 1을 할당하는 대신 레지스터 자체를 XOR하여 CPU주기에서 약간 더 빠릅니다. 이것은 계산이 0으로 시작하고 항상 마지막 요소를 제외한 요소의 길이까지임을 의미합니다.

또한 0의 사용은 할당 된 메모리를 가리키는 하나의 기본 포인터와이 기본 포인터의 오프셋에있는 두 번째 포인터를 사용하는 포인터 산술에서도 널리 사용됩니다. 여기서 값 0을 사용하면 오프셋을 메모리 블록의 기준으로 지정하는 것이 좋습니다. (일반 배열 논리는 기본 주소에 오프셋 x 레코드 크기를 더한 경향이 있습니다.)

그리고 0부터 시작하는 월 숫자? 종종 많은 프로그래밍 환경에서 일부 기본 데이터 이후 날짜 수로 데이터를 계산합니다. 1899 년 12 월 31 일이 인기있는 날짜이지만 기준 날짜로 사용되는 다른 날짜가 많이 있습니다. 다른 모든 날짜는이 기준에서 오프셋되며 하나의 단일 숫자로 저장됩니다. 분수는 시간, 분, 초를 나타내는 데 사용되며 0.25는 24/4 = 6 시간입니다. 따라서 날짜를 실제 날짜로 변환하려면 모든 환경에서이 숫자를 실제 날짜로 변환해야합니다.

그러나 0부터 시작하는 배열과 1부터 시작하는 월 값을 함께 사용하면 문제가 발생합니다. 월 9의 월 이름을 얻으려면 월 배열에서 항목 8을 가져와야합니다. 일부 개발자는 이름을 얻기 전에 월 수를 줄이는 것에 만족할 것입니다. 다른 사람들은 사람들이 숫자가 아닌 이름 만 알고 싶어하기 때문에 월을 0 기반으로 변경하는 것을 선호했습니다. 그것은 개인적인 견해입니다.


92
자바 스크립트 및 AS3 날짜 생성자는 달을 "제외"하는 모든 항목에 대해 실제 값을 취합니다. 이는 알 수없는 이유로 0부터 시작하는 것으로 지정되어야합니다. 이는 의심 할 여지없이 끔찍한 API 디자인입니다.
Triynko 2013

3
나는 동의한다. 내 데이트가 한 달이 된 이유를 알아내는 데 한 시간이 들었습니다. 한 달을 제외하고 모든 것이 1 기반이라는 것은 실제로 의미가 없습니다. 불행히도 아마도 고칠 수 없을 것입니다. 그렇지 않으면 다른 Y2K 문제로 끝날 것입니다 :-).
mike gold

1
TL; DR : 때문에 어레이의 조회 monthName[monthNumber]또는 mon_name[tm_mon]함께 time.h 표기 .
Perseids 2015-08-30

XOR 자체는 약간의 붉은 청어입니다. 그것은 인텔의 것입니다. 다른 MPU는 레지스터를 0으로 만드는 다른 방법이있었습니다. 일부는 효율적인 방법으로 1로 설정했습니다. 제로 기반 사물의 주된 이유는 인덱스 계산입니다. 때로는 산술에도 유용합니다.
alastair

6

그것은 그것이 무엇이며, 그 가정에 따라 만들어진 거대한 소프트웨어의 무게는 그것이 잠시 동안 주변에있을 것이라는 것을 의미합니다.

의견 은 그것이 C의 잘못이고, Johnie가 최근에 온 다른 모든 언어가 그것을 준수했다는 것입니다.

당신은 더 잘 모르는 사람들로부터 재미있는 상황을 얻습니다. 우리 팀이 발견 한 몇 안되는 Y2K 버그 중 하나는 그 struct tm해를 문자 그대로 "19"로 시작했기 때문에 19100 년이라는 자랑스럽게 선언하는 웹 사이트였습니다 .


적어도 한 사람 (나가 아님)이 스크립트에서 사용할 "getRealMonth"및 "setRealMonth"함수를 정의했습니다. 나는 그를 조금도 비난하지 않는다.
Robert L

1
Y2K 버그 참조에 찬성 투표하세요.
Justus Romijn

4

예, 로마인도 제로 문제가있었습니다.

이것은 수학 (프로그래밍, 특히 초기 프로그래밍의 강력한 구성 요소)이 0을 실수, 양수 * 자연수 로 정의하는 수학의 [비 직관적] 결과 일 뿐이며 배열은 실수로 인덱싱되기 때문입니다. , 자연수 "첫 번째"요소는 인덱스 0에 있습니다.

월은 실제로 배열에서 이름이 지정된 값입니다. 여기서 일과 연도는 번호가 매겨진 값입니다. 일 / 년을 { "1", "2", "3",처럼 보이는 배열로 생각하는 것이 더 유용 할 것입니다. ..} 자신.

이것이 수학적으로 정확하다는 것을 제외하고 이것이 왜 그렇게 흔한 지에 관해서는 당신이 나열한 모든 언어가 한 가지 공통의 기원에서 유래했습니다 ...

편집하다:

더 자세히 살펴보면,이 위키피디아 링크는 제로 인덱싱에 대한 몇 가지 좋고 흥미로운 이유를 자세히 설명합니다 (이는 월이 제로 인덱싱되는 이유를 직접적으로 설명하지는 않지만 이미 다루어 졌다고 생각합니다).이 SO 링크는 이전에 질문에 답했습니다.

일반적인 의견은 "역사적 사고"또는 "달이 숫자가 아니기 때문에 일 / 년 저장과 비교할 수 없기 때문"입니다.

* 미안 해요, 미안 해요, 물리학! 이제 내 손을 다림질해라.


5
Zero is not a positive number. It is also not a negative number.
Robert L

Good point, perhaps you should change it to "natural number".
paxdiablo

1
Interesting, I had always thought that C arrays start at 0 to simplify the pointer arithmetic: a[0] == *(a + 0).
too much php

2
Actually, in computing, you can have a positive and negative zero if you use the Ones' complement system. Fortunately, that system is almost never used again. See en.wikipedia.org/wiki/Ones'_complement#Ones.27_complement
Wim ten Brink

Month is also a number as well, just as day in our culture. The first month in a year is really called "1(st) month", and the last is called "12(th) month"
Michael Tsang
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.