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

PHP, с помощью MT:

$items_array = array("alpha", "bravo", "charlie");
$last_pos = count($items_array) - 1;
$random_pos = mt_rand(0, $last_pos);
$random_item = $items_array[$random_pos];
85
задан Jonathan Leffler 30 May 2017 в 01:08
поделиться

7 ответов

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

Как последствия:

  • Операнд sizeof может быть заключенным в скобки типом sizeof (int) вместо объектного выражения.
  • Скобки не нужны: int a; printf ("% d \ n", sizeof a); прекрасно. Их часто видят, во-первых, потому что они re необходимо как часть выражения приведения типа, а во-вторых, потому что sizeof имеет очень высокий приоритет, поэтому sizeof a + b не то же самое, что sizeof (a + b) . Но они не являются частью вызова sizeof, они являются частью операнда.
  • Вы не можете взять адрес sizeof.
  • Выражение, которое является операндом sizeof, не оценивается во время выполнения ( sizeof a ++ не изменяет a).
  • Выражение, которое является операндом sizeof, может иметь любой тип, кроме типов void или функций. Действительно, это своего рода точка sizeof.

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

а во-вторых, потому что sizeof имеет очень высокий приоритет, поэтому sizeof a + b не то же самое, что sizeof (a + b) . Но они не являются частью вызова sizeof, они являются частью операнда.
  • Вы не можете взять адрес sizeof.
  • Выражение, которое является операндом sizeof, не оценивается во время выполнения ( sizeof a ++ не изменяет a).
  • Выражение, которое является операндом sizeof, может иметь любой тип, кроме типов void или функций. В самом деле, это своего рода точка sizeof.
  • Функция будет отличаться по всем этим точкам. Вероятно, есть и другие различия между функцией и унарным оператором, но я думаю, что этого достаточно, чтобы показать, почему sizeof не может быть функцией, даже если была причина этого хотеть.

    а во-вторых, потому что sizeof имеет очень высокий приоритет, поэтому sizeof a + b не то же самое, что sizeof (a + b) . Но они не являются частью вызова sizeof, они являются частью операнда.
  • Вы не можете взять адрес sizeof.
  • Выражение, которое является операндом sizeof, не оценивается во время выполнения ( sizeof a ++ не изменяет a).
  • Выражение, которое является операндом sizeof, может иметь любой тип, кроме типов void или функций. Действительно, это своего рода точка sizeof.
  • Функция будет отличаться по всем этим точкам. Вероятно, есть и другие различия между функцией и унарным оператором, но я думаю, что этого достаточно, чтобы показать, почему sizeof не может быть функцией, даже если была причина этого хотеть.

    поэтому sizeof (a + b) не то же самое, что sizeof (a + b) . Но они не являются частью вызова sizeof, они являются частью операнда.
  • Вы не можете взять адрес sizeof.
  • Выражение, которое является операндом sizeof, не оценивается во время выполнения ( sizeof a ++ не изменяет a).
  • Выражение, которое является операндом sizeof, может иметь любой тип, кроме типов void или функций. Действительно, это своего рода точка sizeof.
  • Функция будет отличаться по всем этим точкам. Вероятно, есть и другие различия между функцией и унарным оператором, но я думаю, что этого достаточно, чтобы показать, почему sizeof не может быть функцией, даже если была причина этого хотеть.

    поэтому sizeof (a + b) не совпадает с sizeof (a + b) . Но они не являются частью вызова sizeof, они являются частью операнда.
  • Вы не можете взять адрес sizeof.
  • Выражение, которое является операндом sizeof, не оценивается во время выполнения ( sizeof a ++ не изменяет a).
  • Выражение, которое является операндом sizeof, может иметь любой тип, кроме типов void или функций. Действительно, это своего рода точка sizeof.
  • Функция будет отличаться по всем этим точкам. Вероятно, есть и другие различия между функцией и унарным оператором, но я думаю, что этого достаточно, чтобы показать, почему sizeof не может быть функцией, даже если была причина этого хотеть.

    Но они не являются частью вызова sizeof, они являются частью операнда.
  • Вы не можете взять адрес sizeof.
  • Выражение, которое является операндом sizeof, не оценивается во время выполнения ( sizeof a ++ не изменяет a).
  • Выражение, которое является операндом sizeof, может иметь любой тип, кроме типов void или функций. В самом деле, это своего рода точка sizeof.
  • Функция будет отличаться по всем этим точкам. Вероятно, есть и другие различия между функцией и унарным оператором, но я думаю, что этого достаточно, чтобы показать, почему sizeof не может быть функцией, даже если была причина этого хотеть.

    Но они не являются частью вызова sizeof, они являются частью операнда.
  • Вы не можете взять адрес sizeof.
  • Выражение, которое является операндом sizeof, не оценивается во время выполнения ( sizeof a ++ не изменяет a).
  • Выражение, которое является операндом sizeof, может иметь любой тип, кроме типов void или функций. В самом деле, это своего рода точка sizeof.
  • Функция будет отличаться по всем этим точкам. Вероятно, есть и другие различия между функцией и унарным оператором, но я думаю, что этого достаточно, чтобы показать, почему sizeof не может быть функцией, даже если была причина этого хотеть.

  • Выражение, которое является операндом sizeof, не оценивается во время выполнения ( sizeof a ++ не изменяет a).
  • Выражение, которое является операндом sizeof, может иметь любой тип, кроме void, или типы функций. Действительно, это своего рода точка sizeof.
  • Функция будет отличаться по всем этим точкам. Вероятно, есть и другие различия между функцией и унарным оператором, но я думаю, что этого достаточно, чтобы показать, почему sizeof не может быть функцией, даже если была причина этого хотеть.

  • Выражение, которое является операндом sizeof, не оценивается во время выполнения ( sizeof a ++ не изменяет a).
  • Выражение, которое является операндом sizeof, может иметь любой тип, кроме void, или типы функций. Действительно, это своего рода точка sizeof.
  • Функция будет отличаться по всем этим точкам. Вероятно, есть и другие различия между функцией и унарным оператором, но я думаю, что этого достаточно, чтобы показать, почему sizeof не может быть функцией, даже если была причина этого хотеть.

    174
    ответ дан 24 November 2019 в 08:13
    поделиться

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

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

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

    21
    ответ дан 24 November 2019 в 08:13
    поделиться

    Потому что:

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

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

    1
    ответ дан 24 November 2019 в 08:13
    поделиться

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

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

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

    4
    ответ дан 24 November 2019 в 08:13
    поделиться

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

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

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

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

    1
    ответ дан 24 November 2019 в 08:13
    поделиться

    Помимо уже указанных ответов об использовании вектора , Vector также имеет набор методов для перечисления и извлечения элементов, которые отличаются от интерфейса List, и разработчики (особенно те, кто изучал Java до 1.2) могут использовать их, если они есть в коде. Хотя перечисления быстрее, они не t проверить, была ли коллекция изменена во время итерации, что может вызвать проблемы, и учитывая, что вектор может быть выбран для ее синхронизации - с сопутствующим доступом из нескольких потоков, это делает эту проблему особенно опасной. Использование этих методов также связывает большой объем кода с Vector, так что будет нелегко заменить его другой реализацией List.

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

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

    (Wikipedia)

    5
    ответ дан 24 November 2019 в 08:13
    поделиться
    Другие вопросы по тегам:

    Похожие вопросы: