2013-06-13 4 views
1

캐스팅?포인터에서 멤버 액세스 사이의 우선 순위 및

(typeB *)p->i 

는 실제로 ((typeB *)p)->i 또는 (typeB *)(p->i)인가?

+0

코드에 여러 가지 문제가 있습니다. 컴파일 할 수 없습니다. 'typeA'와는 반대로'typeB'를 의미합니까? 'p'는 포인터가 아닙니다. 어떻게 캐스팅합니까? 셋째, int 형을 (typeB *)로 변환하려고 시도하는 것 같습니다. – greedybuddha

+0

'typeA'는 포인터 유형이지만 질문자는 지정하지 않은 채로 두었습니다. – jxh

+0

직접 질문을 게시하는 대신 자신을 위해 알아볼 수있는 여러 가지 방법이 있습니다. 예를 들어, 시도해보고 볼 수 있습니다. –

답변

1

연산자 우선 순위 테이블은 ->이 캐스트보다 더 긴밀하게 바인딩됨을 나타냅니다.

typedef void *typeA; 
typeB b; 
typeA a = &b; 
(typeB *)a->i; /* wrong: attempt to dereference a void pointer */ 
((typeB *)a)->i; /* ok */ 

나중에 참조 할 수있는 완전한 연산자 우선 순위 표가 아래에 나와 있습니다. 표에서 목록의 상위에있는 연산자는 목록의 하위에있는 연산자보다 더 엄격하게 바인딩됩니다 (주 표현 연산자가 가장 엄격하게 바인딩됩니다). 동일한 우선 순위의 연산자가 모호한 방식 (즉, () 또는 []과 같은 기본 표현식 연산자에서 캡처되지 않음)에서 동일한 표현식에 사용되는 경우 연결 순서에 따라 해결됩니다. 따라서, 예를 들어 식 :

7 + (3 - 5 * 2 + 15) - 6 

은 (표)에 따라 순서대로 평가된다 : 물론

7 + (3 - 10 + 15) - 6  // evaluate * in() 
7 + (-7 + 15) - 6   // evaluate - in() (it is left of the +) 
7 + 8 - 6     // evaluate + in() 
15 - 6     // evaluate + (it is left of the -) 
9       // evaluate - 

컴파일러는 다르게 계산을 수행 할 수없는, 그러나 그 결과는 반드시 우선 순위 규칙을 따를 때 얻은 결과와 일치해야합니다. C에서

Operator Type Operator(s)          Associativity 
============= ===========          ============= 
Primary  () [] . -> expr++ expr--      left-to-right 
Expression 
Operators  
------------- -----------          ------------- 
Unary   * & + - ! ~ ++expr --expr (typecast) sizeof  right-to-left 
Operators  
------------- -----------          ------------- 
Binary   */%           left-to-right 
Operators  + - 
       >> << 
       < > <= >= 
       == != 
       & 
       ^
       | 
       && 
       || 
------------- -----------          ------------- 
Ternary   ?:            right-to-left 
Operator 
------------- -----------          ------------- 
Assignment  = += -= *= /= %= >>= <<= &= ^= |=    right-to-left 
Operators  
------------- -----------          ------------- 
Comma   ,            left-to-right 
============= ===========          ============= 
0

는 -> operatior의 우선 순위는 캐스팅 (형명)

때문에 (b를 입력 *) P-> I는 (b를 입력 *) (P-> I)

보다 높다