sizeof가 연산자로 간주되는 이유는 무엇입니까?


93

sizeof함수가 아니라 연산자 로 간주되는 이유는 무엇 입니까?

운영자 자격을 얻으려면 어떤 재산이 필요합니까?

답변:


181

C 표준이 그렇게 말하고 있고 유일한 투표를 받기 때문입니다.

결과 :

  • sizeof의 피연산자 sizeof (int)는 객체 표현식 대신 괄호로 묶인 유형일 수 있습니다 .
  • 괄호는 불필요 int a; printf("%d\n", sizeof a);합니다. 완벽합니다. 그들은 종종이 유형 캐스트 표현의 일환으로 필요하고, sizeof 연산자는 매우 높은 우선 순위가 둘째 때문에, 그래서있어 먼저하기 때문에, 볼 수있는 sizeof a + b동일하지 않습니다 sizeof (a+b). 그러나 이들은 sizeof 호출의 일부가 아니라 피연산자의 일부입니다.
  • sizeof의 주소를 가져올 수 없습니다.
  • sizeof의 피연산자 인 표현식은 런타임에 평가 sizeof a++되지 않습니다 ( a를 수정하지 않음).
  • sizeof의 피연산자 인 표현식은 void 또는 함수 유형을 제외한 모든 유형을 가질 수 있습니다. 사실, 그것은 크기의 요점입니다.

기능은 모든 점에서 다를 것입니다. 함수와 단항 연산자 사이에는 다른 차이점이있을 수 있지만 원하는 이유가 있어도 sizeof가 함수가 될 수없는 이유를 보여주기에 충분하다고 생각합니다.


3
와, 그냥 내가 생각하고 있었던 것!
crashmstr

7
더 잘 말할 수 없습니다.
Clement Herreman

요즘에는 가변 길이 배열 (VLA)로 인해 상황이 더 복잡하다고 생각합니다. IIRC, 표준은 sizeof표현에 VLA가 있으면 부작용 도 허용 합니다.
Aaron McDaid

@glglgl 아니요, 말이되지 않습니다. 그 맥락에서, (int)괄호 안에있는 유형의 이름 일뿐입니다. 여기서 괄호는 구문의 일부입니다. sizeof유형의 크기를 취할 때는 필요하지만 표현식의 크기를 취할 때는 필요하지 않습니다. 예를 들어 여기를
anatolyg

1
표준은 sizeof: sizeof unary-expressionsizeof ( type-name )-에 대해 두 가지 표기법을 사용 하므로 C11 표준에서는 '캐스트'로 간주되지 않고 괄호로 묶인 유형 이름으로 간주됩니다. 결과는 거의 동일합니다. (비교를 위해 캐스트 표현은 ( type-name ) cast-expression입니다.) 그리고 Markdown이 Q & A Markdown과 다르게 작동하는 방식이 싫습니다 !
Jonathan Leffler

24

컴파일 타임 상수로 사용할 수 있으며 함수가 아닌 연산자 인 경우에만 가능합니다. 예를 들면 :

union foo {
    int i;
    char c[sizeof(int)];
};

구문 적으로 연산자가 아니라면 함수가 유형을 인수로 취할 수 없기 때문에 전 처리기 매크로 여야합니다. sizeof유형과 변수를 인수로 사용할 수 있으므로 구현하기 어려운 매크로 입니다.


4
+1하지만 인수가 VLA-가변 길이 배열 인 경우 컴파일 타임 상수가 아닙니다.
Jonathan Leffler

6

C 표준이 그렇게 말하고 있고 유일한 투표를 받기 때문입니다.

때문에 표준은 아마 올바른 sizeof형식을 취하고

일반적으로 함수의 도메인 또는 공동 도메인 (또는 둘 다)에 실수보다 훨씬 더 복잡한 요소가 포함 된 경우 해당 함수를 연산자라고합니다. 반대로 함수의 도메인이나 공동 도메인에 실수보다 복잡한 요소가 포함되어 있지 않으면 해당 함수는 단순히 함수라고 할 수 있습니다. 코사인과 같은 삼각 함수가 후자의 예입니다.

또한 함수가 너무 자주 사용되어 일반 F (x, y, z, ...) 형식보다 더 빠르고 쉬운 표기법으로 발전한 경우 결과 특수 형식을 연산자라고도합니다. 예를 들면 더하기 "+"및 나누기 "/"와 같은 중위 연산자와 계승 "!"과 같은 접미 연산자가 있습니다. 이 사용법은 관련된 엔터티의 복잡성과 관련이 없습니다.

(위키 백과)


이것은 "연산자"와 "함수"라는 용어를 그대로 사용하는 C 표준 (및 기타 프로그래밍 언어)의 동기를 설명 할 수 있습니다.
Steve Jessop

5

기능이 아니기 때문입니다. 다음과 같이 사용할 수 있습니다.

int a;
printf("%d\n", sizeof a);

함수에는 진입 점, 코드 등이 있습니다. 함수는 런타임 (또는 인라인)에 실행되어야하며 sizeof는 컴파일 타임에 결정되어야합니다.


2

sizeof 연산자는 런타임이 아닌 컴파일 타임 엔티티이며 함수처럼 괄호가 필요하지 않습니다. 코드가 컴파일되면 컴파일 시간에 해당 변수의 크기로 값을 대체하지만 함수가 실행 된 후 함수에서 반환 값을 알 수 있습니다.


1

때문에:

  • 함수에 값을 전달할 때 객체의 크기는 함수에 전달되지 않으므로 sizeof"함수"는 크기를 결정할 방법이 없습니다.
  • C에서 함수는 한 가지 유형의 인수 만받을 수 있습니다. sizeof ()는 모든 종류의 다른 것들을 받아 들여야합니다 (변수와 유형! C의 함수에 유형을 전달할 수 없습니다)
  • 함수를 호출하는 것은 인수와 기타 불필요한 오버 헤드를 복사하는 것을 포함합니다.

1

함수와 약간의 차이가 있습니다. sizeof 값은 컴파일 시간에 해결되지만 런타임에는 해결되지 않습니다!


7
VLA-가변 길이 배열-인수 제외.
Jonathan Leffler

1

객체의 크기를 계산하기 위해 컴파일 타임에만 사용할 수있는 유형 정보가 필요한 컴파일 타임 연산자 이기 때문입니다 . 이것은 C ++에 적용되지 않습니다.


0

sizeof()연산자는 컴파일 시간이 발생합니다. 매개 변수 또는 인수를 판별하는 데 사용할 수 있습니다.


-1

Sizeof (), 분명히 함수이자 연산자라고 생각합니다. 왜? 함수는 항목 단계에서 항목을위한 괄호를 포함하기 때문입니다. 그러나 주로 연산자 원인 연산자는 동작 문자이므로 sizeof는 괄호 안의 피연산자에 대해 동작하는 동작 문입니다.

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