아래는 컴파일에 실패합니다.
typedef int arr[10];
int main(void) {
return sizeof arr;
}
sizeof.c:3: error: expected expression before ‘arr’
하지만 내가 그것을 변경하면
sizeof(arr);
모든 것이 좋습니다. 왜?
아래는 컴파일에 실패합니다.
typedef int arr[10];
int main(void) {
return sizeof arr;
}
sizeof.c:3: error: expected expression before ‘arr’
하지만 내가 그것을 변경하면
sizeof(arr);
모든 것이 좋습니다. 왜?
sizeof
는 이것이 오늘날 C99 Standard와 근본적으로 동일한 방식으로 설명 한다고 확신합니다 . sizeof
C가 1989 년 ANSI에 의해 표준화되기 전부터 사용 가능합니다.
답변:
6.5.3에 따르면 sizeof
다음과 같은 두 가지 형식이 있습니다 .
sizeof unary-expression
sizeof ( type-name )
때문에 arr
코드가 인에 type-name
, 그것은 괄호해야합니다.
sizeof
연산자 라는 것을 강조하기 위해 연산자가 아닌 유형에 "속하는"괄호입니다.
sizeof
운영자를 나타냅니다 .
sizeof ( type-name )
.. 그러나 첫 번째 형식의 경우 예를 들어를 작성할 수sizeof(x)
있으며 함수 호출처럼 보이지만 ( sizeof
키워드가 아니라면) 실제로는 괄호로 묶인 표현식에 적용되는 연산자입니다. 그게 당신이 염두에 두었던 것입니까?
sizeof
것은 sizeof <SOMETHING>
예를 들어 함수와는 반대로 구문 적 으로 printf
는 printf ( <SOMETHING> )
. 괄호는에 속 printf
하지만sizeof
. sizeof
괄호로 묶인 유형 이름에가 적용될 때 , 나는 그것을 무의 캐스트로 생각하고 싶습니다. 유형 만 "반환"합니다.
sizeof ( type-name )
그 자체로 표현 하는 것을 선호 한다. (표준에서는이를 연산자 ( type-name )
라고 부르지 만 일반적인 의미에서 실제로는 피연산자가 아닙니다.)
이것이 언어가 지정되는 방식입니다. 여기서 유형 이름은 괄호로 묶어야합니다.
문법이 다음과 같다고 가정합니다.
sizeof unary-expression
sizeof type-name
이제 예를 들어 다음 표현식은 모호합니다.
sizeof int * + 0
그것은 될 수 중 하나 sizeof(int *) + 0
또는sizeof(int) * +0
. 식에 추가 된 별표는식이 아니기 때문에 단항 식에서는 이러한 모호성이 발생하지 않습니다 (하지만 일부 형식 이름의 경우 하나를 추가하면 다시 형식 이름이 됨).
여기에 무언가를 지정해야했고 유형 이름을 괄호로 묶어야하는 것이 모호성을 해결하는 방법입니다.