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.