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

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

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



답변

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가 함수가 될 수없는 이유를 보여주기에 충분하다고 생각합니다.


답변

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

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

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


답변

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

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

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

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

(위키 백과)


답변

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

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

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


답변

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


답변

때문에:

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


답변

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