특별한 이유가 있습니까? 그게 언어가 어떻게 쓰여졌는지 알지만, 우리는 그것을 바꿀 수 없습니까? 인덱스가 1로 시작하면 우리가 직면하게 될 도전은 무엇입니까?배열의 색인/목록이 1로 시작하지 않는 이유는 무엇입니까?
답변
역사적인 이유로, 그리고 메모리에서 배열이 "만들어지는"방법과 관련된 이유로.
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을 기준으로 한 지수가 돌에 법률 적으로 책정 된 것이 아니기 때문에 "다른 많은 언어로"언급 하셨다는 것이 좋습니다. – Hyperboreus
실제로 질문의 모든 언어는 C 위에 개발되었습니다. – thagorn
그러나 'Matlab'에서는 주소가 '1'부터 시작됩니다. –
는 컴퓨터가 어떤 변수의 첫 번째 부분 느릅 나무에 주소를 기억한다는 것입니다 뒤에 기본적인 이유 :-) 다른 나무입니다/개체가 저장됩니다. 따라서 인덱스는 그 사이의 거리와 찾고자하는 것 사이의 거리를 나타내므로 첫 번째 것은 0, 두 번째는 1 ...
좋은 질문입니다. 사실 거의 모든 프로그래밍 언어 구현은 0에서 인덱싱을 시작합니다.
잠재적으로 해결 방법을 사용하여 1로 시작하는 것처럼 보이게 할 수 있지만 그렇지 않습니다. 내가 할 수있는 것보다
다 익스트라의 기사는 제로 기반 배열의 더 나은 방어를 줄 것이다 :
http://www.cs.utexas.edu/users/EWD/transcriptions/EWD08xx/EWD831.html
한 가지는 당신이 참조와 포인터를 사용하여 배열을 탐색 할 수 있다는 것입니다. 실제로 배열 연산은 백엔드에서 포인터 연산으로 감소합니다.
는 a
배열 (1 차원)의 기본 주소입니다 당신은 단순히 (a + n)
을 할 수있는 배열의 nth
요소에 도달한다고 가정하지만, 첨자가 1
에서 시작하면 다음 nth
요소에게 도달하기 항상 (a + n -1)
해야 할 것입니다.
이것은 배열의 이름을 가져 오는 것만 큼 가장 간단한 방법 인 시작 요소의 주소이기 때문입니다!
C 및 C++에서 배열 인덱싱은 오프셋 포인터를 역 참조하기위한 구문 설탕입니다. 즉, array[i]
은 *(array + i)
과 같습니다. 포인터가 메모리 블록의 시작 부분을 가리키는 것은 당연한데 배열의 첫 번째 요소는 인 *array
일 필요가 있음을 의미합니다.
- 1. SWFUpload가 업로드를 시작하지 않는 이유는 무엇입니까?
- 2. quartz가 작업을 다시 시작하지 않는 이유는 무엇입니까?
- 3. AIR에서 전체 크기로 시작하지 않는 이유는 무엇입니까?
- 4. 가제보가 ROS를 시작하지 않는 이유는 무엇입니까?
- 5. 배열의 요소가 계산되지 않는 이유는 무엇입니까?
- 6. 0 또는 1로 시작하지 않는 jQuery 유효성 검사 번호
- 7. 이 프로그램을 실행하는 동안 y가 1로 표시되지 않는 이유는 무엇입니까?
- 8. Java에서 비트 시프트가 -1로 작동하지 않는 이유는 무엇입니까?
- 9. ORDER BY DAYOFWEEK()의 회신이 일요일로 시작하지 않는 이유는 무엇입니까?
- 10. JMS 연결을 만들고 시작하지 않는 유효한 이유는 무엇입니까?
- 11. WiX Burn이 다시 시작되고 실행을 다시 시작하지 않는 이유는 무엇입니까?
- 12. Guard LiveRoad가 서버를 시작하지 않는 이유는 무엇입니까? Gemfile :
- 13. CountDownTimer가 필요할 때 OnTick을 시작하지 않는 이유는 무엇입니까?
- 14. HBase Rest End Point가 AWS에서 시작하지 않는 이유는 무엇입니까?
- 15. 내가 지정한 포트에서 얇게 시작하지 않는 이유는 무엇입니까?
- 16. 대수 산란 축이 제로에서 시작하지 않는 이유는 무엇입니까?
- 17. 내 안드로이드 응용 프로그램을 열거 나 시작하지 않는 이유는 무엇입니까?
- 18. fprintf가 인쇄 순서를 시작하거나 시작하지 않는 이유는 무엇입니까?
- 19. 레이블 텍스트가 항상 같은 지점에서 시작하지 않는 이유는 무엇입니까?
- 20. AVD가 내 Android 앱을 시작하지 않는 이유는 무엇입니까?
- 21. 새 소비자 그룹 ID가 처음부터 시작하지 않는 이유는 무엇입니까?
- 22. CachedThreadPool이 전체 용량이지만 두 번째 스레드를 시작하지 않는 이유는 무엇입니까?
- 23. 서버를 시작할 때 Tomcat이 커넥터를 시작하지 않는 이유는 무엇입니까?
- 24. 탭 순서가 색인의 첫 번째부터 시작하지 않는 이유는 무엇입니까?
- 25. 내 페이지 매김이 새 라인에서 시작하지 않는 이유는 무엇입니까?
- 26. 배열의 모든 요소 값으로 시작하지 않는 모든 파일을 삭제하려고합니다.
- 27. 특정 문자로 시작하지 않는 bash 배열의 계수 요소
- 28. IP가 로컬 환경에서 :: 1로 표시되는 이유는 무엇입니까?
- 29. Spring MVC가 LoadOnStartup을 1로 설정하는 이유는 무엇입니까?
- 30. Web.config에서 subStatusCode를 -1로 설정하는 이유는 무엇입니까?
귀하의 언어 선택에서 Eiffel, Smalltalk 및 Prologue를 잊어 버렸습니다. – WhozCraig
[번호 매기기가 0부터 시작해야하는 이유 : Dijkstra] (http://www.cs.utexas.edu/users/EWD/ewd08xx/EWD831.PDF) –
왜 -1로 시작하지 않습니까? – BenDundee