공부중

[C/C++] Right to Left Rules(오른쪽-왼쪽 규칙) 본문

Programing/C, C++

[C/C++] Right to Left Rules(오른쪽-왼쪽 규칙)

곤란 2020. 11. 14. 02:41
반응형

흔히 오른쪽에서 왼쪽으로 읽는다 이런 규칙이 있다라는것을 학부생때 들어보긴 했었는데

그렇게 많은 책을 읽어본것은 아니지만 책에서도 이러한 내용은 없었고

비슷한것은 연산자 우선순위 조립 방향?? 이정도?

그래서 찾아본 결과 모든 참고가 되었다는 링크는 캘리포니아 샌디에고 대학의 한 웹페이지로 링크가 다들 가고 있었다.

cseweb.ucsd.edu/~ricko/rt_lt.rule.html

위의 내용을 그대로 해석해 보고 정리해서 이해해보려고 한다.


*	포인터 - 항상 왼쪽에 있다.
[]	배열 - 항상 오른쪽에 있다.
()	함수 반환 - 항상 오른쪽에 있다.

위의 규칙을 기억하자.

1. 제일 먼저 선언된 식별자 찾고 식별자(identifier, 변수명 또는 함수명)을 기준으로 시작합니다.

2. 식별자를 기준으로 오른쪽에 기호 "()"가 있다면 함수 선언 또는 "[]"를 발견한 경우 배열이라 말할수 있다. 닫는괄호")" 와 닫는 대괄호"]" 등으로 끝난뒤에 더 이상 기호가 존재하지 않을때까지 발견해본다.

3. 식별자 왼쪽에 있는 기호를 보았을때 *인경우 포인터가 되며 위에서 언급한것이 아닌경우 (예 : int)인 경우 그대로 받아들이세요 (예 : int형의 무엇인가이다) 왼쪽방향으로 * 또는 ** 또는 여는괄호"(" , "[" 등 아무것도 발견되기 전까지 이동하면서 읽어들이고 해석한다.

 

예 1)

int * p [];

1) 식별자를 찾는다

int * p [];

    "p"

2) 오른쪽으로 이동했을때 발견된 기호를 찾는다 이 기호는 위에서 언급한 괄호종류인지를 판별해서 해석한다.

 int * p [];

    "p는 배열이다"

3) 더 이상 오른쪽에 기호가 존재하지 않으므로 왼쪽을 탐색합니다.

int * p [];

    "p는 포인터의 배열이다."

4) 계속 왼쪽으로 이동해서 기호 또는 키워드를 찾는다.

int * p [];

    "p는 int형 포인터 배열이다."

 

예 2)

int * ( * func ( ) ) ( );

1) 식별자를 찾는다

int * ( * func ( ) ) ();

    "func"

2) 오른쪽으로 이동한다.

int * ( * func ( ) ) ();

    "func는 함수반환이다."

3) 닫는 괄호로 인해서 더이상 우측으로 이동이 불가능하므로 왼쪽으로 이동한다.

int * ( * func ( ) ) ( );

    "func는 포인터를 반환하는 함수이다."

4) 여는 괄호로 인해서 더이상 왼쪽으로 이동이 불가능 하므로 우측으로 이동한다.

int * ( * func ( ) ) ( );

    "func는 '포인터를 반환하는 함수'를 반환하는 함수." -> 어감이 좀 이상하지만 ...;;

5) 우측에 더이상 이동할 것이 없으므로 왼쪽에서 찾아본다.

int * ( * func ( ) ) ( );

    "func는 '포인터를 반환하는 함수'에 대한 포인터를 반환하는 함수이다.

6) 우측에 더이상 읽을 것이 없으므로 마지막으로 계속 왼쪽으로 이동한다.

int * ( * func ( ) ) ( );

    "func는 int에 대한 포인터를 반환하는 함수에대한 포인터를 반환하는 함수이다."

 

개인적으로 이런 가독성이 떨어지는 코드는 안쓰는것이 좋다고 생각하지만..

이런 코드는 디버깅으로 각각의 리턴값 확인해보기도 힘들다 ㅠ

종종 이런 코드가 있기는 하겠지? 라고 생각하게 된다 ㅠ

 

다 작성하고나서 보니 연산자 우선순위와 결합성에 연관이 있는 내용인것같다.

연산 1순위 연산자 ( ) , [ ] , -> , . 등이 좌에서 우로 결합성이 이어지므로

먼저 왼쪽에서 우측으로 이동을해서 판별을하고

 

연산 2순위 연산자인 sizeof, &, ++, ==, ~, !, *(포인터), +(단항 연산자), -(단항 연산자) 등이 우에서 좌로 결합성이이어진다.

결국에는 연산순위 결합성에 따른 읽는 방법이라고 생각한다.

 

 


riptutorial.com/ko/c/example/18833/%EC%98%A4%EB%A5%B8%EC%AA%BD-%EB%98%90%EB%8A%94-%EC%99%BC%EC%AA%BD-%EB%82%98%EC%84%A0-%EA%B7%9C%EC%B9%99%EC%9D%84-%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC-c-%EC%84%A0%EC%96%B8-%ED%95%B4%EB%8F%85

이미 잘 번역된(?)것이 이미 있었다 -_-;;

 

C Language - 오른쪽 또는 왼쪽 나선 규칙을 사용하여 C 선언 해독 | c Tutorial

c documentation: 오른쪽 또는 왼쪽 나선 규칙을 사용하여 C 선언 해독

riptutorial.com


추가로 www.informit.com/articles/article.aspx?p=31783 페이지의 하단에 The Right-Left Rule 내용이 적혀있는것을 찾았다.

 

몇가지 괜찮은 내용은 아래와 같다.

속성 의미
*( ) 함수는 포인터를 반환한다.
(*)( ) 함수 포인터
*[ ] 포인터 배열
(*)[ ] 배열에 대한 포인터
[ ][ ] 배열의 배열
** 포인터에 대한 포인터

 

잘못된 조합

속성 의미
( )[ ] 함수는 배열을 반환
[ ]( ) 함수 배열
( )( ) 함수 반환 함수

 

반응형