C++의 새로운 연산자?

오늘 슬랙을 보다가 재미난 글 이 올라왔다.

1
2
3
4
5
6
int x = 5;
while(x --> 0) {
    std::cout << x << " ";
}

// 출력: 4, 3, 2, 1, 0

C++에 새로운 연산자가 추가되었다는 내용이였는데, while문에 -->를 쓰면 x가 하나씩 줄면서 반복문을 돌게 된다는 것이다.

처음 봤을 때는 재미있는 연산자가 추가되나보다 생각을 했다. 근데 글을 더 읽어보니 이게 이전 버전의 C++에서도 동작을 한다는 것이였고, 실제로 돌려보니 동작을 했다! 여기서 뭔가 이상하다고 생각을 해서 자세히 보니까 진실을 알게 되었다.

1
while(x --> 0)  =>  while((x--) > 0)

실제로는 x에 --연산자가 붙고, x--가 0보다 큰지 검사하는 구문이다. 이걸 띄어쓰기를 적절히 활용해서 마치 -->라는 새로운 연산자가 있는것처럼 보이는 것이다.

이 사실을 알았을 때, 어이가 없으면서 재미있었다. 이처럼 C++에서는 재미있는 상황이 많이 있는 것 같다.


C++에서 볼 수 있는 또다른 재미있는 상황이 있다.

1
d[i] == *(d + i)

배열에 있는 값에 접근을 할 때, 컴파일러는 위와 같이 처리를 한다. 여기서 +는 앞뒤를 서로 바꿔도 같은 값이기 때문에, 아래의 식들도 모두 같다.

1
d[i] == *(d + i) == *(i + d) == i[d]

이를 응용하면 다음과 같은 끔찍한(!) 코드도 실행이 된다.

1
2
3
4
5
d[1] = 2[d] = 1;
for(int i = 3; i <= 20; i++) {
    i[d] = d[i-1] + (i-2)[d];
}
// d: 1 1 2 3 5 8 13 ...

어떻게 보면 언어의 결함이라고 볼 수 있을 것 같다. 저런건 컴파일러 단계에서 막을 수 있을 것 같은데 왜 막지 않았을까?