우리가 알고 sizeof
있는 데이터 타입 표현의 크기를 계산하기 위해 사용 연산자이며, 피연산자 표현하면, 괄호는 생략 될 수있다.
int main()
{
int a;
sizeof int;
sizeof( int );
sizeof a;
sizeof( a );
return 0;
}
의 첫 번째 사용법 sizeof
은 잘못된 반면 다른 것은 옳습니다.
gcc를 사용하여 컴파일하면 다음 오류 메시지가 표시됩니다.
main.c:5:9: error: expected expression before ‘int’
내 질문은 C 표준이 이러한 종류의 작업을 허용하지 않는 이유입니다. 윌 sizeof int
모호성의 원인?
답변
다음은 모호 할 수 있습니다.
sizeof int * + 1
그게 (sizeof (int*)) + 1
아니면 (sizeof(int)) * (+1)
?
분명히 C 언어는 모호성을 해결하기위한 규칙을 도입 할 수 있었지만 왜 그렇게 신경 쓰지 않았는지 상상할 수 있습니다. 언어를 그대로 사용하면 유형 지정자는 표현식에서 “네이 키드”로 표시되지 않으므로 해당 초가 *
유형의 일부 인지 산술 연산자 인지 여부를 확인하는 규칙이 필요하지 않습니다 .
기존 문법은 이미 잠재적 인 모호성을 해결했습니다 sizeof (int *) + 1
. 그것은이다 (sizeof(int*))+1
, 하지 sizeof((int*)(+1))
.
C ++에는 함수 스타일 캐스트 구문으로 해결할 수있는 다소 유사한 문제가 있습니다. 당신은 쓸 수 있습니다 int(0)
당신은 쓸 수 있습니다 typedef int *intptr; intptr(0);
,하지만 당신은 쓸 수 없습니다 int*(0)
. 이 경우 해결 방법은 “naked”유형이 단순 유형 이름이어야하며 공백이 있거나 후행 구두점이있을 수있는 이전 유형 ID 일 수 없다는 것입니다. sizeof
동일한 제한으로 정의 되었을 수도 있지만 확실하지 않습니다.
답변
에서 C99 표준
6.5.3.4.2 연산자 식 또는 유형의 괄호 이름 일 수있다 피연산자의 크기 (바이트)를 산출한다.
sizeof
귀하의 경우 int
에는 표현도 괄호 안의 이름도 아닙니다.
답변
C에서 sizeof 연산자를 사용하는 방법에는 두 가지가 있습니다. 구문은 다음과 같습니다.
C11 6.5.3 Unary operators
...
sizeof unary-expression
sizeof ( type-name )
유형을 피연산자로 사용할 때마다 언어의 구문 정의에 따라 괄호가 있어야합니다. 식에 sizeof를 사용하면 괄호가 필요하지 않습니다.
C 표준은 표현식에서 사용할 수있는 예를 하나 제공합니다.
sizeof array / sizeof array[0]
그러나 일관성과 운영자 우선 순위와 관련된 버그를 피하기 위해 개인적으로 상황에 관계없이 항상 ()를 사용하는 것이 좋습니다.