2009-09-08 4 views

ответ

152

Поскольку стандарт 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 не может быть функцией, даже если есть причина, по которой она хочет быть.

+2

Ничего себе, только то, о чем я думал! – crashmstr

+6

Не могу сказать это лучше. –

+0

удивительное объяснение! –

3

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

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

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

20

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

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

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

+2

+1, но обратите внимание, что это не константа времени компиляции, когда аргумент представляет собой массив переменной длины VLA. –

1

Потому что:

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

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

+5

За исключением VLA - массив переменной длины - аргументы. –

5

Поскольку стандарт C говорит так, и он получает единственное голосование.

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

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

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

(Wikipedia)

+0

Это, вероятно, объясняет мотивацию стандарта C (и других языков программирования) при использовании терминов «оператор» и «функция», как они это делают. –

0

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

1

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

0

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

+0

Почему downvote? –

Смежные вопросы