В вызове функции, что такое оператор, и каковы операнды?

Я пытаюсь понять некоторые основы C.KRC Язык программирования C говорит

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

  • В вызове функции, что такое оператор, и каковы операнды?

    Является ли () оператором?

    Является ли имя функции операндом?

    Являются ли аргументы внутри операндов ()?

  • Является ли обозначение функции синонимом вызова функции?

Спасибо.

Ответы

Ответ 1

В вызове функции () является оператором, так же как [] является оператором при доступе к элементу массива.

6.5.2 Операторы Postfix

Syntax
1 postfix-expression:
primary-expression
postfix-expression [ expression ]
postfix-expression ( argument-expression-listopt )
postfix-expression . identifier
postfix-expression -> identifier
postfix-expression ++
postfix-expression --
( type-name ) { initializer-list }
( type-name ) { initializer-list , }

argument-expression-list:
assignment-expression
argument-expression-list , assignment-expression  

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

Являются ли аргументы внутри операндов ()?

Нет. В соответствии со стандартом C список выражений указывает аргументы функции.

Ответ 2

Текст в стандарте C почти идентичен, 6.5.2.2:

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

Синтаксис: (6.5.2):

postfix-expression ( argument-expression-listopt )

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


Определение обозначения функции (6.3.2.1):

Обозначение функции - это выражение, имеющее тип функции.

Значение в выражении func();, func будет обозначать функцию, но выражение в целом будет вызовом функции. Так что это не совсем тот же термин.

Рассмотрим пример funcptr_t f = func;, который включает в себя обозначение функции func, но не вызов функции.