C & C++/C

[C] C language의 연산자 우선순위는 설계 실수인가?

Razelo 2024. 1. 1. 17:12

최근 흥미로운 내용을 접했다. 

 

C language의 연산자 우선순위에 설계상 결함이 있다는 이야기다. 

 

전설의 C에 언어 설계 결함이 있을 수 있나? 라는 생각이 들었다. (지금도 결함 정도로 생각되진 않지만)

 

내용은 이렇다. 

 

& | 연산자와 == 연산자 간의 연산자 우선 순위로 인해 실수할 여지가 크다는 내용이다. 

 

& | 보다 ==의 연산자 우선순위가 더 높기 때문에 문제가 될 수 있다고 한다. 

 

아래 코드가 있다고 보자. 

if (a & b == c) {
    // ...
}

 

위 코드는 a&b의 결과가 c와 동등한지 확인하는 코드가 아니다. 오히려 b==c가 먼저 평가되고 그 결과와 a와 bit and를 한다. (당연히도)

 

해당 의견을 접하고 먼저 든 생각은 이렇다. 

 

이게 왜 설계상 오류일까? 

 

연산자 우선순위가 ==가 더 높다는 걸 사람들이 이미 알기 때문에 명시적으로 (a&b) == c라고 써주면 되지 않을까라고 생각했다. (물론 설계상 mistake라고 이야기하는 이유는 실수 여지가 존재하는 모호함 때문이라고 한다.) 

 

하지만 언어가 널리 사용되고 오랜 기간 사용되었다는 점에서 설계 mistake가 될 이유는 사라진다. 더 많은 사람들이 C언어를 사용하고 C언어의 역사가 길어질수록 흔히 말하는 보편적인 사용 사례 덕분에 설계 mistake라고 생각할 여지가 적어진다는 점이다. 

 

앞으로 새롭게 만들게 될 language가 있다고 하면 완벽한 C스타일은 아니더라도 적어도 일부분 차용하거나 개선의 면모를 보인 설계를 가져갈 수 있다. 새 언어가 정반대의 스타일과 듣도 보도 못한 문법을 만들어내지는 않는다. 물론 누군가 만들어냈을 수도 있지만 그런 언어는 메이저가 되지 못한다. 그 이유는 새로운 언어의 학습 난이도와 지금껏 우리가 써왔던 언어들의 보편적인 모양새 때문이다. 

 

만약 새 언어가 존재하는데, 

r-value에 표현식이 아니라 identifier가 온다면? 

연산자 간 우선 순위가 아예 존재하지 않는다면? 

... 

 

이런 언어는 아무도 쓰지 않는다. 왜냐면 지금껏 이런 언어는 써본 적 없기 때문이다. 

자잘한 불편은 긴 역사를 가진 범용적인 보편 사례에 비하면 중요치 않다. 

사람들은 언제나 올바른 정답을 원하는게 아니다. 

 

때문에 나는 위 설계가 실수라고 생각하지 않는다. (이제와서 실수라고 하기엔 의미가 없다)

반응형