Чому sizeof
вважається оператором, а не функцією?
Яка властивість необхідна для кваліфікації оператора?
Відповіді:
Тому що стандарт С говорить так, і він отримує єдиний голос.
Як наслідки:
sizeof (int)
замість виразу об’єкта.int a; printf("%d\n", sizeof a);
цілком добре. Їх часто бачать, по-перше, тому що вони потрібні як частина вираження типу, а по-друге, тому що sizeof має дуже високий пріоритет, тому sizeof a + b
це не те саме, що sizeof (a+b)
. Але вони не є частиною виклику sizeof, вони є частиною операнда.sizeof a++
не змінює a).Функція буде відрізнятися в усіх цих точках. Можливо, існують інші відмінності між функцією та одинарним оператором, але я думаю, що цього достатньо, щоб показати, чому sizeof не може бути функцією, навіть якщо була причина, щоб це хотілося.
sizeof
би мати побічні ефекти, якщо у виразі є VLA.
sizeof
: sizeof unary-expression
і sizeof ( type-name )
- отже, у стандарті C11 він не вважається "приводом", а назвою типу в дужках. Чистий результат майже однаковий. (Для порівняння, вираз вибору ( type-name ) cast-expression
.) І я ненавиджу те, як коментар Markdown працює інакше, ніж питання та відповіді Markdown!
Його можна використовувати як константу часу компіляції, що можливо лише в тому випадку, якщо це оператор, а не функція. Наприклад:
union foo {
int i;
char c[sizeof(int)];
};
Синтаксично, якби це не був оператор, то це мав би бути макрос препроцесора, оскільки функції не можуть приймати типи як аргументи. Це було б складно реалізувати, оскільки sizeof
може брати як аргументи як типи, так і змінні.
Тому що стандарт С говорить так, і він отримує єдиний голос.
І стандарт, мабуть, правильний, оскільки sizeof
бере тип і
Загалом, якщо або домен, або кодомен (або обидва) функції містять елементи, значно складніші від дійсних чисел, ця функція називається оператором. І навпаки, якщо ні домен, ні кодомен функції не містять елементів, більш складних, ніж реальні числа, ця функція, швидше за все, буде називатися просто функцією. Тригонометричні функції, такі як косинус, є прикладами останнього випадку.
Крім того, коли функції використовуються настільки часто, що вони еволюціонували швидше або легше, ніж загальна форма F (x, y, z, ...), отримані спеціальні форми також називаються операторами. Прикладом можуть бути оператори інфіксу, такі як додавання "+" та поділ "/", та оператори постфіксу, такі як факторіал "!". Це використання не пов’язане зі складністю залучених суб’єктів.
Тому що це не функція. Ви можете використовувати його так:
int a;
printf("%d\n", sizeof a);
Функція має точку входу, код тощо. Функція повинна запускатися під час виконання (або вбудована), розмір повинен визначатися під час компіляції.
sizeof - оператор часу компіляції, а не час виконання і не потребує дужок, як функція. Коли код компілюється, він замінює значення на розмір цієї змінної під час компіляції, але у функції після того, як функція виконується, тоді ми будемо знати повертається значення.
Тому що:
sizeof
"функція" не може визначити розмірІснує невелике відхилення від функції - значення sizeof вирішується під час компіляції, але не під час виконання!
Оскільки це оператор часу компіляції, який для обчислення розміру об’єкта вимагає інформації про тип, яка доступна лише під час компіляції. Це не стосується C ++.
Sizeof (), я думаю, очевидно, що це і функція, і оператор. Чому? Оскільки функція містить дужки для введення на етапі введення. Але в основному також оператори причини оператора мають символ дії, тому sizeof - це оператор дії, який діє на операнд у дужках.