Почему sizeof считается оператором?


почему sizeof является оператором, а не функцией?

какое свойство необходимо для квалификации в качестве оператора?

9 80

9 ответов:

потому что стандарт 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.

функция будет отличаться по всем этим вопросам. Есть, наверное, и другие различия между функцией и унарным оператором, но я думаю, что этого достаточно, чтобы показать, почему sizeof не может быть функцией, даже если есть причина этого хотеть.

он может использоваться как константа времени компиляции, что возможно только в том случае, если это оператор, а не функция. Например:

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

синтаксически если бы это был не оператор, то он должен был бы быть макросом препроцессора, поскольку функции не могут принимать типы в качестве аргументов. Это было бы трудно реализовать макрос, так как sizeof может принимать в качестве аргумента как типы, так и переменные.

потому что стандарт C так говорит, и он получает единственный голос.

и стандарт, вероятно, правильно, потому что sizeof тип и

кроме того,когда функции используются так часто,что они развились быстрее или проще обозначений, чем общие F(x, y, z,...) форма, полученные специальные формы также называются операторами. Примеры включают в себя инфиксные операторы, такие как сложение "+" и деление"/", и постфиксные операторы, такие как факториал "!". Это использование не связано с сложность вовлеченных объектов.

(Wikipedia)

потому что это не функция. Вы можете использовать его так:

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

функция имеет точку входа, код и т. д. Функция должна быть запущена во время выполнения (или встроена), sizeof должен быть определен во время компиляции.

потому что:

  • когда вы передаете значение функции, размер объекта не передается функции, поэтому a sizeof "функция" не будет иметь никакого способа определения размера
  • в C функции могут принимать только один тип аргумента; sizeof () должен принимать все виды различных вещей (переменные, а также типы! Вы не можете передать тип функции в C)
  • вызов функции включает в себя создание копии аргументов и других ненужных накладные расходы

есть небольшое отличие от функции-значение sizeof разрешается во время компиляции, но не во время выполнения!

потому что это во время компиляции оператора что для вычисления размера объекта требуется информация о типе, которая доступна только во время компиляции. Это не относится к C++.

оператор sizeof является сущностью времени компиляции, а не временем выполнения и не нуждается в скобках, как функция. Когда код компилируется, он заменяет значение размером этой переменной во время компиляции, но в функции после того, как функция будет выполнена, мы будем знать возвращаемое значение.

sizeof() оператор-это время компиляции будет появление. Он может быть использован для определения параметров или аргументов.