Почему sizeof
считается оператором, а не функцией?
Какое имущество необходимо для квалификации оператора?
Потому что стандарт C так говорит, и он получает единственный голос.
В качестве последствий:
sizeof (int)
, а не выражением объекта.int a; printf("%d\n", sizeof a);
все в порядке. Их часто можно увидеть, во-первых, потому что они необходимы как часть выражения приведения типа, а во-вторых, потому что sizeof имеет очень высокий приоритет, поэтому sizeof a + b
это не то же самое, что sizeof (a+b)
. Но они не являются частью вызова sizeof, они являются частью операнда.sizeof a++
не изменяет a).Функция будет отличаться по всем этим пунктам. Вероятно, есть и другие различия между функцией и унарным оператором, но я думаю, что этого достаточно, чтобы показать, почему sizeof не может быть функцией, даже если для этого была причина.
sizeof
побочные эффекты, если в выражении присутствует VLA.(int)
нет ничего необычного - просто название типа в круглых скобках. Круглые скобки здесь являются частью синтаксисаsizeof
- они требуются при выборе размера типа, но не требуются при выборе размера выражения. См., Например, здесьsizeof
:sizeof unary-expression
иsizeof ( type-name )
- поэтому в стандарте C11 это считается не «приведением», а именем типа в скобках. Чистый результат примерно такой же. (Для сравнения, выражение приведения - это( type-name ) cast-expression
.) И мне не нравится то, как Markdown комментариев работает не так, как Markdown в вопросах и ответах!Его можно использовать как константу времени компиляции, что возможно, только если это оператор, а не функция. Например:
union foo { int i; char c[sizeof(int)]; };
Синтаксически, если бы это не был оператор, это должен был бы быть макрос препроцессора, поскольку функции не могут принимать типы в качестве аргументов. Этот макрос сложно реализовать, поскольку он
sizeof
может принимать в качестве аргумента как типы, так и переменные.источник
И стандарт, вероятно, правильный, потому что
sizeof
принимает тип и(Википедия)
источник
Потому что это не функция. Вы можете использовать это так:
int a; printf("%d\n", sizeof a);
У функции есть точка входа, код и т. Д. Функция должна запускаться во время выполнения (или встраиваться), размер sizeof должен быть определен во время компиляции.
источник
Оператор sizeof - это объект времени компиляции, а не время выполнения, и ему не нужны круглые скобки, как функция. Когда код компилируется, он заменяет значение размером этой переменной во время компиляции, но в функции после выполнения функции мы узнаем возвращаемое значение.
источник
Так как:
sizeof
«функция» не сможет определить размеристочник
Есть небольшое отличие от функции - значение sizeof разрешается во время компиляции, но не во время выполнения!
источник
Поскольку это оператор времени компиляции, который для вычисления размера объекта требует информации о типе, доступной только во время компиляции. Это не относится к C ++.
источник
sizeof()
оператор - это время компиляции. Его можно использовать для определения параметров или аргументов.источник
Sizeof (), я думаю, очевидно, что это и функция, и оператор. Зачем? Потому что функция содержит круглые скобки для ввода на этапе ввода. Но в основном также операторы, вызывающие операторы, являются символом действия, поэтому sizeof - это оператор действия, который действует на операнд в круглых скобках.
источник