2012-06-22 2 views

답변

4

sizeof

 
void main() 
{ 
    int p = 3; 

    printf("%d", sizeof(int) *p); 
} 

이진 *보다 높은 우선 순위를 갖는 단항 연산자이므로, 식 sizeof (int) * p(sizeof (int)) * p로서 해석된다. 는 sizeof 연산자로,

하지만 발현를 sizeof ((INT) * P)과 같이 평가 될 수 없습니다

   * 
     / \ 
     sizeof p 
     | 
     (int) 

편집 onezero의 코멘트에서

다음은 파스 트리입니다 , 형변환 연산자 및 * (참조 해제) 연산자의 우선 순위가 같고 오른쪽에서 왼쪽으로 연결됩니까? 당신이 볼 수 있듯이

 
(6.5.3) unary-expression: 
    postfix-expression 
    ++ unary-expression 
    -- unary-expression 
    unary-operator cast-expression 
    sizeof unary-expression 
    sizeof (type-name) 
    alignof (type-name) 

(int)sizeof 식, 전체 정류장의 일환으로 해석됩니다

여기합니다 (C2011 표준의 ballot draft에서) 관련 구문입니다. 캐스트 표현의 일부로 해석되지 않습니다. 이 구문에서는 sizeof캐스트 식이 직접 따라 올 수 없습니다. 그들 사이 단항 연산자 (& 중 하나 *, +, -, ~, !)이 있어야한다.

+0

어쩌면 당신은 당신이 방금 한 좋은 테이블에서 말한 것을 정확하게 설명하는 위키 백과 문서에 링크 할 수도 있습니다 : [C/C++ Operator precedence] (http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B#Operator_precedence) – Alex

+0

@JohnBode 그러나 sizeof 연산자, 타입 캐스트 연산자 및 * (역 참조) 연산자의 우선 순위가 같고 오른쪽에서 왼쪽으로 연결되는 것처럼 표현식을 sizeof (int) * p와 같이 평가할 수 없습니까? – onezero

+0

@Alex : 우. 나는 두 테이블을 C와 C++ 두 개의 분리 된 테이블로 분리 해주기를 바랐다. –

-1

p는 무엇입니까? 가 출력 12

 
void main() 
{ 
    char *p = "a"; 

    printf("%d", sizeof((int) *p)); 
} 

가 출력 4.

+2

아니요 p는 무엇입니까? 두 번째 예제에서 괄호를 명시 적으로 도입했기 때문에 컴파일러가 컨텍스트에서 표현식을 평가하도록 강제로 (p는 포인터 임) 방식으로 결과를 4로 가져옵니다. – onezero