왜 (그리고 언제) sizeof 뒤에 괄호를 사용해야합니까?


80

아래는 컴파일에 실패합니다.

하지만 내가 그것을 변경하면

모든 것이 좋습니다. 왜?


연산자로 sizeof는 ansi-c에서 사용할 수 없습니다
Grim

2
@Kostya : 내 K & R 사본 (내가 가지고있는 C 언어의 가장 초기 설명)은 매우 멀리 떨어져 있고 지금 확인할 수 없지만 110 % sizeof는 이것이 오늘날 C99 Standard와 근본적으로 동일한 방식으로 설명 한다고 확신합니다 . sizeofC가 1989 년 ANSI에 의해 표준화되기 전부터 사용 가능합니다.
pmg

답변:


120

6.5.3에 따르면 sizeof다음과 같은 두 가지 형식이 있습니다 .

때문에 arr코드가 인에 type-name, 그것은 괄호해야합니다.


15
+1 및 sizeof연산자 라는 것을 강조하기 위해 연산자가 아닌 유형에 "속하는"괄호입니다.
pmg

@pmg : 설명해 주셔서 감사합니다! 예, 언급했듯이 표준은 sizeof운영자를 나타냅니다 .
Ise Wisteria

4
@pmg : 괄호가 "속한다"는 것이 명확하지 않다고 생각합니다. 두 번째 형식의 구문은 토큰 3 개와 비 터미널 1 개로 구성됩니다 sizeof ( type-name ).. 그러나 첫 번째 형식의 경우 예를 들어를 작성할 sizeof(x) 있으며 함수 호출처럼 보이지만 ( sizeof키워드가 아니라면) 실제로는 괄호로 묶인 표현식에 적용되는 연산자입니다. 그게 당신이 염두에 두었던 것입니까?
Keith Thompson

3
내가 의미하는 sizeof것은 sizeof <SOMETHING>예를 들어 함수와는 반대로 구문 적 으로 printfprintf ( <SOMETHING> ). 괄호는에 속 printf하지만sizeof . sizeof괄호로 묶인 유형 이름에가 적용될 때 , 나는 그것을 무의 캐스트로 생각하고 싶습니다. 유형 만 "반환"합니다.
pmg

2
@pmg : 확실히 그렇게 생각할 수 있지만 오해의 소지가 있습니다. 캐스트와의 유일한 실제 유사점은 괄호 안에 유형 이름이 있다는 것입니다. 이는 단지 구문상의 편리함의 우연 일뿐입니다. 나는 sizeof ( type-name )그 자체로 표현 하는 것을 선호 한다. (표준에서는이를 연산자 ( type-name )라고 부르지 만 일반적인 의미에서 실제로는 피연산자가 아닙니다.)
Keith Thompson

44

이것이 언어가 지정되는 방식입니다. 여기서 유형 이름은 괄호로 묶어야합니다.

문법이 다음과 같다고 가정합니다.

sizeof unary-expression sizeof type-name

이제 예를 들어 다음 표현식은 모호합니다.

그것은 될 수 중 하나 sizeof(int *) + 0또는sizeof(int) * +0 . 식에 추가 된 별표는식이 아니기 때문에 단항 식에서는 이러한 모호성이 발생하지 않습니다 (하지만 일부 형식 이름의 경우 하나를 추가하면 다시 형식 이름이 됨).

여기에 무언가를 지정해야했고 유형 이름을 괄호로 묶어야하는 것이 모호성을 해결하는 방법입니다.


-3

당신이 가지고 있기 때문이라고 생각합니다 typedef . 제거하면 컴파일됩니다.

위키 백과의 예 :

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.