요런 개념을 표로 일목요연하게 한 번쯤 정리할 필요를 예전부터 느꼈던지라, 잠시 짬을 내어 만들었다. C++ 프로그래머라면 고개가 절로 끄덕여질 내용 되겠다. 

토큰 type 앞 type 뒤 value 앞 양 value 사이 value 뒤
&   참조자형 명시 address-of (L-value만) 비트 AND  
&&   R-value 참조자형 명시   논리 AND  
*   포인터형 명시 배열 및 포인터 역참조 곱셈  
±     양/음 부호 덧셈/뺄셈  
괄호() (1) 형변환(typecast)
(2) 타입 선언자 나열 순서 조절
함수형 명시 연산 순서 조절   함수 호출
대괄호[]   배열형 명시     배열 참조
부등호<>   템플릿 인자 명시   비교 템플릿 함수 인자
콤마,       (1) 콤마 연산
(2) 함수 호출/템플릿 인자 구분
(3) 변수 선언 구분
 

  • 괄호는 영어에서 접속사도 되고 지시형용사/지시대명사, 관계대명사까지 다 되는 that만큼이나 정말 다재다능한 물건이다.
  • 베이직은 이례적으로 =, ()가 쓰임이 중첩되어 있다. =가 대입과 동등 연산을 모두 담당하며, ()가 함수 호출과 배열 첨자를 모두 담당한다. 함수 호출은 문법적으로 매우 제한된 문맥에서만 허용되니, C/C++같은 함수 포인터가 존재하지 않는다면 () 중첩이 아주 불가능하지는 않은 듯하다.
  • C/C++은 @ $ ` 기호를 전혀 사용하지 않는다. 예전에 베이직은 각종 기괴한 기호들을 이용하여 변수의 자료형을 표현하곤 했다. A$는 문자열, A%는 정수, A#은 실수 같은 식이다.
  • 파스칼은 포인터형을 선언하는 토큰이 ^인데, C/C++와는 달리, 포인터형을 나타낼 때와 포인터를 역참조할 때 토큰이 등장하는 위치가 서로 다르다. ^Type 그리고 Value^ 이런 식.
  • int *a와 int a[5]배열에 대해서는 똑같이 *a를 쓸 수 있지만, 잘 알다시피 배열의 역참조와 포인터의 역참조는 개념적으로 다르다. C/C++을 처음 공부하는 초보자가 굉장히 혼동할 수도 있을 듯하다.
  • 포인터는 다중 포인터가 존재할 수 있고 역참조도 여러 단계를 연달아 할 수 있다. 그러니 *가 여러 개 연달아 올 수 있다. 그 반면, 참조자는 구조적으로 딱 한 번만 참조/역참조가 가능하게 만들어진 포인터의 축소판이다. 그렇기 때문에 &&에다가 별도로 R-value 참조자라는 물건을 집어넣을 수도 있다. 이걸 생각해 낸 고안자는 정말 천재다.
  • 일반적으로 &는 address-of 연산자이며 R-value를 상대로는 적용이 되지 않는다.
    그러나 일부 값은 L-value가 아님에도 불구하고 & 연산자의 적용이 가능하며, 심지어 a와 &a가 동일하게 취급되는 것도 있는데, 바로 static 배열과 일반 함수이다.
    기본적으로 포인터의 성격을 갖추고 있는지라 &를 안 해도 기본적으로 자신의 주소가 되돌아오고, &를 붙여도 무방하다는 오묘한 특징이 있다.
  • 한편, C/C++에서 배열은 고유한 자료형임에도 불구하고 함수의 인자로 전달되거나 리턴값이 될 때는 그냥 포인터든 배열의 포인터든 포인터의 형태로만 전달된다. 배열 그 자체가 전달되지는 못한다.
    배열을 생으로 함수를 통해 주고 받으려면 구조체에다가 배열을 집어넣어야 한다.

Posted by 사무엘

2015/01/02 19:39 2015/01/02 19:39
,
Response
No Trackback , 4 Comments
RSS :
http://moogi.new21.org/tc/rss/response/1046

Trackback URL : http://moogi.new21.org/tc/trackback/1046

Comments List

  1. Lyn 2015/01/05 12:53 # M/D Reply Permalink

    a와 &a가 동일하게 취급되는건 문자열 리터럴도 있습니다 ㅎㅎ

    1. 사무엘 2015/01/05 13:46 # M/D Permalink

      어 진짜네요. "문자열 리터럴"도 뒤에 [], 앞에 *만 붙을 수 있는 줄 알았는데 앞에 &도 붙을 수 있구나..
      타입은 포인터의 주소(포인터)가 되지만 어쨌든 값 자체는 동일하고...;;; 짱입니다. ㄷㄷㄷㄷ

  2. Lyn 2015/01/05 21:55 # M/D Reply Permalink

    엇 파스칼도 포인터 타입선언과 역참조가 같아요. 둘다 ^ 에요
    @는 포인터 참조 연산자

    단지 C++은 역참조 토큰 * 가 변수 앞에 붙는데 파스칼은 변수 뒤에 ^가 붙는 차이. 타입 선언시에도 ^가 파스칼은 타입 앞에 C++은 *이 타입 뒤에 붙네요

    1. 사무엘 2015/01/05 23:41 # M/D Permalink

      아.. 이런 관계인 거지요?

      int a, *b;
      b=&a;
      *b=5;

      var a: integer; b: ^integer;
      begin
      b:=@a;
      b^:=5;
      end;

      @는 C로 치면 address-of & 연산자에 대응하는군요. 제가 잠시 착각했습니다.
      파스칼은 포인터형 선언할 때와 포인터를 역참조할 때, 심벌이 다른 게 아니라..
      심벌은 같지만 명칭의 앞에 오느냐 뒤에 오느냐 위치가 달라진다는 걸로 요약되네요. C++은 여전히 어느 경우든 prefix인 것이고..
      덕분에 저도 이제 확실하게 개념을 익혔네요. 감사합니다. ㅎㅎ

Leave a comment
« Previous : 1 : ... 617 : 618 : 619 : 620 : 621 : 622 : 623 : 624 : 625 : ... 1554 : Next »

블로그 이미지

철도를 명절 때에나 떠오르는 4대 교통수단 중 하나로만 아는 것은, 예수님을 사대성인· 성인군자 중 하나로만 아는 것과 같다.

- 사무엘

Archives

Authors

  1. 사무엘

Calendar

«   2019/10   »
    1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31    

Site Stats

Total hits:
1269132
Today:
160
Yesterday:
559