2013-08-07 1 views
0

특별한 이유가 있습니까? 그게 언어가 어떻게 쓰여졌는지 알지만, 우리는 그것을 바꿀 수 없습니까? 인덱스가 1로 시작하면 우리가 직면하게 될 도전은 무엇입니까?배열의 색인/목록이 1로 시작하지 않는 이유는 무엇입니까?

+3

귀하의 언어 선택에서 Eiffel, Smalltalk 및 Prologue를 잊어 버렸습니다. – WhozCraig

+6

[번호 매기기가 0부터 시작해야하는 이유 : Dijkstra] (http://www.cs.utexas.edu/users/EWD/ewd08xx/EWD831.PDF) –

+1

왜 -1로 시작하지 않습니까? – BenDundee

답변

6

역사적인 이유로, 그리고 메모리에서 배열이 "만들어지는"방법과 관련된 이유로.

C에서 배열은 메모리 조각 (크기에 따라 컴파일러 수준의 정보가 있음)입니다. 첫 번째 요소에 대한 포인터 (참조)가 있습니다. 당신이 대칭 명확

int array[10]; // your array 

int *p = array; // reference to first element of array 
int *q = p + 1; // reference to second element of array 
int *r = p + 2; // reference to third element of array 

을 할 수있는 두 번째 요소로 이동합니다 :

array[0] // reference to first element of array 
array[1] // reference to second element of array 
array[2] // reference to third element of array 

C의 [x] 연산자는 사실 array + x로 컴파일됩니다.

표시 되나요? 배열은 C에서 "기수 0"입니다.이 이유 때문에 다른 많은 언어에서도 마찬가지입니다.

이제 C++은 C에 뿌리를두고 있으며 Java는 C++ 및 다른 언어로 뿌리를두고 있으며 C#은 C++, java 및 다른 언어로 뿌리를두고 있습니다 ... 같은 트리.

기본 명확하게

+0

0을 기준으로 한 지수가 돌에 법률 적으로 책정 된 것이 아니기 때문에 "다른 많은 언어로"언급 하셨다는 것이 좋습니다. – Hyperboreus

+1

실제로 질문의 모든 언어는 C 위에 개발되었습니다. – thagorn

+0

그러나 'Matlab'에서는 주소가 '1'부터 시작됩니다. –

3

는 컴퓨터가 어떤 변수의 첫 번째 부분 느릅 나무에 주소를 기억한다는 것입니다 뒤에 기본적인 이유 :-) 다른 나무입니다/개체가 저장됩니다. 따라서 인덱스는 그 사이의 거리와 찾고자하는 것 사이의 거리를 나타내므로 첫 번째 것은 0, 두 번째는 1 ...

1

좋은 질문입니다. 사실 거의 모든 프로그래밍 언어 구현은 0에서 인덱싱을 시작합니다.

잠재적으로 해결 방법을 사용하여 1로 시작하는 것처럼 보이게 할 수 있지만 그렇지 않습니다. 내가 할 수있는 것보다

다 익스트라의 기사는 제로 기반 배열의 더 나은 방어를 줄 것이다 :

http://www.cs.utexas.edu/users/EWD/transcriptions/EWD08xx/EWD831.html

1

한 가지는 당신이 참조와 포인터를 사용하여 배열을 탐색 할 수 있다는 것입니다. 실제로 배열 연산은 백엔드에서 포인터 연산으로 감소합니다.

a 배열 (1 차원)의 기본 주소입니다 당신은 단순히 (a + n)을 할 수있는 배열의 nth 요소에 도달한다고 가정하지만, 첨자가 1에서 시작하면 다음 nth 요소에게 도달하기 항상 (a + n -1)해야 할 것입니다.

이것은 배열의 이름을 가져 오는 것만 큼 가장 간단한 방법 인 시작 요소의 주소이기 때문입니다!

2

C 및 C++에서 배열 인덱싱은 오프셋 포인터를 역 참조하기위한 구문 설탕입니다. 즉, array[i]*(array + i)과 같습니다. 포인터가 메모리 블록의 시작 부분을 가리키는 것은 당연한데 배열의 첫 번째 요소는 인 *array 일 필요가 있음을 의미합니다.

관련 문제