Почему sizeof считается оператором?
почему sizeof
является оператором, а не функцией?
какое свойство необходимо для квалификации в качестве оператора?
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,...) форма, полученные специальные формы также называются операторами. Примеры включают в себя инфиксные операторы, такие как сложение "+" и деление"/", и постфиксные операторы, такие как факториал "!". Это использование не связано с сложность вовлеченных объектов.
потому что это не функция. Вы можете использовать его так:
int a; printf("%d\n", sizeof a);
функция имеет точку входа, код и т. д. Функция должна быть запущена во время выполнения (или встроена), sizeof должен быть определен во время компиляции.
потому что:
- когда вы передаете значение функции, размер объекта не передается функции, поэтому a
sizeof
"функция" не будет иметь никакого способа определения размера- в C функции могут принимать только один тип аргумента; sizeof () должен принимать все виды различных вещей (переменные, а также типы! Вы не можете передать тип функции в C)
- вызов функции включает в себя создание копии аргументов и других ненужных накладные расходы
есть небольшое отличие от функции-значение sizeof разрешается во время компиляции, но не во время выполнения!
потому что это во время компиляции оператора что для вычисления размера объекта требуется информация о типе, которая доступна только во время компиляции. Это не относится к C++.
оператор sizeof является сущностью времени компиляции, а не временем выполнения и не нуждается в скобках, как функция. Когда код компилируется, он заменяет значение размером этой переменной во время компиляции, но в функции после того, как функция будет выполнена, мы будем знать возвращаемое значение.