C99 §6.5.2.1/2:
The definition of the subscript operator [] is that E1[E2] is identical to (*((E1)+(E2))).
a[b]는 *(a+b)의 syntactic sugar야
a[5]는 *(a+5)로써 나타낼 수 있어.
그렇다면 음수로 a[-1]꼴도 가능하며
a[1] = *(a+1) 이고 *(a+1) = *(1+a)니까
a[1] = 1[a]네.
2차원 배열을 풀어보자면
a[b][c] = *(*(a+b)+c)
그럼 a[b][c]또한 b[a][c]가 될 수 있겠네.
위 성질으로 한번 재밌는 문법 유도할 수 있는 사람있어?
a[1] = 1[a] 지만, 알고리즘으로 구현해서 성능체크해보면 후자( 1[a] )는 대개 좀 후달려. 컴파일러가 제대로 최적화해주지 않아.
ㄴ 어째서일까? *(a+b)꼴로 변환 한 후 컴파일 하면 속도 차이가 없을텐데, 그러지 않나보지?
base 주소 + offset 의 명령어 구조 때문이야. offset 이 움직이는데 최적화 되어 있어.
ㄴ 꼬치꼬치 캐물어서 정말 미안한데, "움직이다"라는 건 무엇을 뜻하는거야?
보통 배열을 사용할때는 첨자를 움직이기 위해서잖아.
for( int i = 0; i < 10; ++i ) a[i] = 0; 처럼 말이지.
ㄴ 아하. 그대 정체가 뭐야? 내가 본 이들중 가장 연륜있어 보이는데..
이때 [ ] 안의 요소에 대해 우선 변화가 가정되고 최적화 되기 때문에 반대로 뒤집은것과 다른 코드가 만들어진다는거야. 컴파일러마다 차이는 있을 수 있는데, 궁금해서 속도 체크해보니 VC++에서 차이가 나더라.
내 정체야 진짜 프로그래머지 뭐~
할아버지~ 틀니 떨어졋ㄱ어요
어 저거 예전에 있어보이게 할라고 막 풀어썼었는데 ㅋㅋㅋㅋ 지금와서 하나도 못알아봄...
mozzart// g++에서 테스트 하니 차이가 없네.
한 두개 돌려선 모르구~ 엄청 정확하게 몇 가지 용례에서 돌려봐야됨유~
나는 1메가개 배열 sum 에서 테스트 해쥬~