태그 보관물: c

c

sizeof (int)가 맞고 sizeof int가 잘못된 이유는 무엇입니까?

우리가 알고 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]

그러나 일관성과 운영자 우선 순위와 관련된 버그를 피하기 위해 개인적으로 상황에 관계없이 항상 ()를 사용하는 것이 좋습니다.


답변