"char* a" 표기보다 "char *a" 표기가 더 났다는 걸 어디서 읽은 듯 한데, 도무지 어디서 읽었는지 기억이 안 나네요.(책이었는지 웹사이트었는지 조차 기억이 가물가물)
몇 가지 이유를 들어가며 설명한 듯한 기억은 있는데, 어떤 이유였는지는 기억이 아지 않네요 ^^
세상사 많은 것이 그렇지만 말이죠.
MS는 typedef를 써서 LPCHAR, PCHAR 이렇게 쓰는 모양이지만 저는 이것도 별로 맘에 안 들더군요.
C의 창시자 Dennis Ritchie는 후에 char a* 를 쓰는게 좋았다라는 발언을 한 것 같은데 이것도 논란의 여지가 있습니다.
예를 들어 *a[n] 이면 (*a)[n]이 아니라 *(a[n]) 이 됩니다.
만일 *연산을 먼저 하고 싶으면 (*a)[n]을 할 수 밖에 없지요.
(*a)[n]을 써야 하는 것은 배열에 대한 pointer 때문입니다.(pointer to array)
예를 들어 2차원 배열을 만들고 매개변수로 만들거나 반환받을 때 필요하지요.
C++는 vector로 인해서 사용할 일이 없어진 것 같지만 C는 필요합니다.
이런 괄호연산이 필요하게 혼잡한 느낌을 주기 때문에 C에서 다차원 배열
(정확히는 배열의 배열)을 쓰기가 어렵고, 초심자들은
1차원 배열만으로 활용법이 제한되는 경우가 많습니다.
저는 다차원 배열의 활용이 적은 이유 때문에 pointer와 배열을 동일하다라는 잘못된 설명이
먹힌다고 생각합니다.
하여간 만일 *를 후위표기로 쓰면 a*[n]과 a[n]* 으로 쓰게 되니까 우선순위 문제로
고민할 필요도 없고 괄호도 필요없어지지요.
그리고 C의 복잡한 유도도 이해하기 편해질 거라고 생각합니다.
C++도 참조연산자 &가 전위표기라 복잡한 유도에 쓸려면 상당히 골치아프지요.
저는 후위표기로 몰아버리면 객체지향의 method 연쇄와 같은 느낌을 줄 거라고 생각합니다.
연산이라는게 객체지향적으로 보면 method 내지는 message니까 모든 단항연산을
후위로 몰아버리면 객체지향적 느낌을 주는 연산자 표현이 가능해지지요.
만일 전위표기로 모두 바꿔버리면 거꾸로 함수형 언어같은 느낌을 주게 되는데
함수호출연산자를 전위표기로 바꾸기는 어렵지 않을까라는 생각이 듭니다.
즉 func(a, b) 이렇게 함수호출연산자는 후위표기를 쓸 수 밖에 없죠.
안 그러면 함수형 언어들처럼 (func a b) 혹은 func a b 이 형태를 써야할테고...
제 생각에 Dennis Ritchie가 pointer의 역참조 연산자 *를 전위표기로 쓴 것은 그것이
수학적으로 많이 활용되는 style이라고 생각한 것일 것 같아요.
*은 연산자니까 동사이며 함수와 같은 역할, a는 피연산자니까 매개변수
그러니까 dereference(a)의 단축이니까 *a로 쓰자...
이런 거였겠죠?.. ^_^
설명이 길어졌는데 Programming Language에 관심있는 분들은 참고하시라는... ^_^.
극단적으로 가면 분명 언어는 단순해지고, 복잡한 중첩구조를 단순화시켜주지만 사람들은
이런 형태의 표현기법에 익숙하지 않다는 것이 가장 큰 문제겠지요.
사람마다 다르지
사람마다 다르지 않을까요?
저도 char *a 가 좋은 것 같은데, * 를 실제 포인터에 가까이 붙여 주니까.
char* a 로 쓰면
char* a, b 와 같이 헷갈리는 경우도 있구요.
const char* a 를 char const* a 로 쓰면 일관성 문제도 있고, const char *a 나 char const *a 가 보기 좋은 듯.
다른 경우지만, C++ template 의 저자는 const int &a 보다 int const &a 를 좋아 하더군요.
그 논쟁은 어느 한쪽이 좋다고 결론 내리기 어려운 것 같더군요.
세상사 많은 것이 그렇지만 말이죠.
MS는 typedef를 써서 LPCHAR, PCHAR 이렇게 쓰는 모양이지만 저는 이것도 별로 맘에 안 들더군요.
C의 창시자 Dennis Ritchie는 후에 char a* 를 쓰는게 좋았다라는 발언을 한 것 같은데 이것도 논란의 여지가 있습니다.
그렇게 되면
a*=3 이 a* = 3 으로 해석되겠죠. a *= 3 이 아니라...
인용: char* a, b 와
이게 제일 큰 단점이 아닐까 합니다.
char a* 라... 흠. 재밌네요.
뭐 변수 정의할때는 a* 로 쓰고 주소 참조할때는 *a로 쓸수도 있는 거니까요.
후위표기의 가장 큰 장점은 연산자우선순위 문제로 인한 괄호사용을 줄일 수 있다는 것입니다.
많은 C, C++ 연산자는 후위표기를 하는 연산자가 우선순위가 높습니다.
예를 들어 *a[n] 이면 (*a)[n]이 아니라 *(a[n]) 이 됩니다.
만일 *연산을 먼저 하고 싶으면 (*a)[n]을 할 수 밖에 없지요.
(*a)[n]을 써야 하는 것은 배열에 대한 pointer 때문입니다.(pointer to array)
예를 들어 2차원 배열을 만들고 매개변수로 만들거나 반환받을 때 필요하지요.
C++는 vector로 인해서 사용할 일이 없어진 것 같지만 C는 필요합니다.
이런 괄호연산이 필요하게 혼잡한 느낌을 주기 때문에 C에서 다차원 배열
(정확히는 배열의 배열)을 쓰기가 어렵고, 초심자들은
1차원 배열만으로 활용법이 제한되는 경우가 많습니다.
저는 다차원 배열의 활용이 적은 이유 때문에 pointer와 배열을 동일하다라는 잘못된 설명이
먹힌다고 생각합니다.
하여간 만일 *를 후위표기로 쓰면 a*[n]과 a[n]* 으로 쓰게 되니까 우선순위 문제로
고민할 필요도 없고 괄호도 필요없어지지요.
그리고 C의 복잡한 유도도 이해하기 편해질 거라고 생각합니다.
C++도 참조연산자 &가 전위표기라 복잡한 유도에 쓸려면 상당히 골치아프지요.
저는 후위표기로 몰아버리면 객체지향의 method 연쇄와 같은 느낌을 줄 거라고 생각합니다.
연산이라는게 객체지향적으로 보면 method 내지는 message니까 모든 단항연산을
후위로 몰아버리면 객체지향적 느낌을 주는 연산자 표현이 가능해지지요.
만일 전위표기로 모두 바꿔버리면 거꾸로 함수형 언어같은 느낌을 주게 되는데
함수호출연산자를 전위표기로 바꾸기는 어렵지 않을까라는 생각이 듭니다.
즉 func(a, b) 이렇게 함수호출연산자는 후위표기를 쓸 수 밖에 없죠.
안 그러면 함수형 언어들처럼 (func a b) 혹은 func a b 이 형태를 써야할테고...
제 생각에 Dennis Ritchie가 pointer의 역참조 연산자 *를 전위표기로 쓴 것은 그것이
수학적으로 많이 활용되는 style이라고 생각한 것일 것 같아요.
*은 연산자니까 동사이며 함수와 같은 역할, a는 피연산자니까 매개변수
그러니까 dereference(a)의 단축이니까 *a로 쓰자...
이런 거였겠죠?.. ^_^
설명이 길어졌는데 Programming Language에 관심있는 분들은 참고하시라는... ^_^.
극단적으로 가면 분명 언어는 단순해지고, 복잡한 중첩구조를 단순화시켜주지만 사람들은
이런 형태의 표현기법에 익숙하지 않다는 것이 가장 큰 문제겠지요.
함수의 리턴타입과 변수선언시 좀 다르게 사용하지 않을까요?
즉, 사용자 함수를 선언 및 정의 할때는...
char* function_name(매개변수...)
보통 위와같이 사용하고
변수 선언시에는
char *chVal;
위와같이 선언하는게 보기좋은걸로 알고있습니다.
char* a, b 이거 때문인가 보네요..
char *a, *b 와 char* a, b는 다른 것이기 때문인가 보네요.
답변 주신분들 감사합니다.
-_- 전 앞에다..
전 그냥 char* a 가 포인터를 이해하는데 도움이 돼서..
앞에다 붙입니다.
저것 땜시 고생한걸 생각하면.. ㅜ 0 ㅜ
============================================================
선한 인간이냐 악한 인간이냐는 그사람의 의지에 달렸다. -에픽테토스-
의지 노력 기다림은 성공의 주춧돌이다. -파스퇴르-
============================================================
============================================================
선한 인간이냐 악한 인간이냐는 그사람의 의지에 달렸다. -에픽테토스-
의지 노력 기다림은 성공의 주춧돌이다. -파스퇴르-
============================================================
댓글 달기