최근 흥미로운 내용을 접했다.
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가 온다면?
연산자 간 우선 순위가 아예 존재하지 않는다면?
...
이런 언어는 아무도 쓰지 않는다. 왜냐면 지금껏 이런 언어는 써본 적 없기 때문이다.
자잘한 불편은 긴 역사를 가진 범용적인 보편 사례에 비하면 중요치 않다.
사람들은 언제나 올바른 정답을 원하는게 아니다.
때문에 나는 위 설계가 실수라고 생각하지 않는다. (이제와서 실수라고 하기엔 의미가 없다)
'C & C++ > C' 카테고리의 다른 글
[C] Mingw 세팅 (0) | 2023.11.23 |
---|---|
[C] 환경변수를 출력하는 envp의 미스터리한 동작 발견. 이유가 대체 뭘까요? <extern char ** environ;> (1) (0) | 2022.04.13 |
[C] C언어 질문: 두 배열 a와 b에서 b = a 에서 에러가 발생하는 이유는 무엇일까? (0) | 2021.11.21 |
[C] 시스템 프로그래밍 (0) | 2021.11.08 |
[Linux] linux에서 atoi함수 (0) | 2021.10.27 |