-
C++ 배열의 선언에 관하여 - 결과공부/C++ 2019. 3. 27. 11:19
앞서 작성했던 글인
https://indrawer.tistory.com/9
"C++ 배열의 선언에 관하여" 에서 적은 것처럼 따져보려고 검색을 해봤다.
구글링한걸 자랑스럽게 말하는게 웃길수도 있지만, 구글이 나보다야 똑똑하더라고
(물론 헛소리도 그 만큼 많음)
각설하고,
"왜 마지막은 들어가지 않는가" 와 추가적으로 같은 맥락으로 "왜 0부터 시작하는가" 도 같이 찾아보았다.
일단 검색한 결과 나와 비슷한 생각을 했던 사람은 은근히 있었고, 그것에 대해서 찾아봐서 reference를 남긴 사람조차 이미 있었다.
선구자에 대해서 깊고 압도적인 감사를..
그래서 내가 찾은 문서는
Why Numbering should Start At Zero라는 문서였는데, 이 문서는 무려 EwDijkstra...
다익스트라 알고리즘에서 들으셨던 그 분의 문서이다.
a) a <= i < b
b) a < i <= b
c) a <= i <= b
d) a < i < b
"이 4가지 중에서 가장 좋은것은 첫번째인 a 이다" 라고 다익스트라가 말한 이유는 다음과 같다.
1.
"There is a smallest natural number. Exclusion of the lower bound —as in b) and d)— forces for a subsequence starting at the smallest natural number the lower bound as mentioned into the realm of the unnatural numbers. That is ugly"
2.
"inclusion of the upper bound would then force the latter to be unnatural by the time the sequence has shrunk to the empty one. That is ugly"
3.
"Extensive experience with Mesa has shown that the use of the other three conventions has been a constant source of clumsiness and mistakes, and on account of that experience Mesa programmers are now strongly advised not to use the latter three available features. "
뭐라는지 모르겠는데... ugly ugly 하는데..
친절한 사전의 도움을 받아 번역하자면,
1. 시작지점을 제외하게 되면 시작지점이 자연수가 아니니까
못생겼다. (b와 d 제거)(....?)2. 끝지점을 포함하게 되면 배열이 0으로 줄어들 때 부자연스럽다(
못생겼다). (c제거)(아마 0<= i < 0 이 0<= i <=0 보다 자연스럽다는 것을 이야기하는듯)
3. 프로그래머의 경험적으로도 다른 3가지(b,c,d)는 실수를 야기했다.
친절하게 간단한 예시를 들어준 부연설명을 보자면
1. a <= i < b 인경우에는 안의 원소의 수를 b-a로 표현가능하다.
2. 또한 시작점(a)이 0일경우에는 원소의 개수를 b라고 표현할 수 있다.
3. 이런 이유로 실수가 적더라 ( 이러나 저러나 난 왜 배열 넘버링 실수해서 터지는걸까)
일단 이러한 맥락에서 보자면 처음 궁금했던
INT ARR[8] 이라고 적는데 실사용부분은 0~7이다.
에서의 8은 위와 같은 이유로 쓰는것이다 라고 봐도 되는것인가 싶은데,(8개이니 8-0으로 표현)
뭔가 굉장히 논리적이고 합당하고 증명적인 무엇인가가 있을것 같았지만, 막상 보니 그렇지 않아 만족스럽지 못했다.
그렇다고 하더라도, 경험적 통계는 무시할 수 없지...
추가적으로 "0부터 시작하는 이유는 무엇일까" 에 대한 궁금증을 찾아보다가 문득 생각난것이 있었는데,
외국에서는 1층을 0층(ground floor) 라고 한다는 점이다. [물론 아닌곳도 있다]
심지어 나이도 만 으로 계산해서 0살부터 계산하기도 한다.
확실히 시작점은 0 이 맞고 0이 양수와 음수의 기준으로 자리잡고 있기 때문에 연산하는 것에 편리함을 줄 경우도 있다.
(이 또한 bit를 표현할때 그렇지 않은 경우도 있지만.. ex) -128~127)
비슷한 맥락으로 포인터연산에 대한 이야기가 있는데,
시작지점을 p로 두고 포인터연산을 하게 되는데, 만약 1부터 시작을 한다고 한다면 몇가지 시나리오가 있다.
1. 맨앞을 p+1로 두고 쓴다.
이것은 ... p를 가리키려는데 +1을 붙이면 이상한데?
2. 그럼 맨앞을 비워둔다.
고거슨 아깝구연...
3. 그럼 0부터 하던가
음... 그럼 그래야하나?
포인터연산에 대한 예시가 좀 더 그럴듯한 이야기일지도 모르겠다. 하드웨어와 소프트웨어는 완전히 별개는 아니니까...
어느것이 맞다고는 딱 잘라서 말할 수는 없지않을까?
(적어도이 블로그와 내가 그정도의 지식과 권위를 가졌다고는 생각하지 않는다)
찾아봐도 명확하게 이거다 하는 느낌이 오는 글이 없다보니 흐믈흐믈하게 글이 끝나는데,
뭐 궁금증이라는게 팍하고 해결되면 좋겠지만 그렇지 않은경우가 많더라...
뭐... 여긴 그런 글을 쓰는 곳인데요?
'공부 > C++' 카테고리의 다른 글
[C++] OpenCV - RAW이미지 읽기 (0) 2019.10.22 음수는 %연산자가 어떻게 동작할까? (0) 2019.08.29