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

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

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

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

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

    Имя функции - операнд?

    Есть аргументы внутри () Операнды?

  2. Является ли указатель функции синонимом вызова функции?

Благодарю.

2 ответа

Решение

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

6.5.2 Постфиксные операторы

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 в списке выражений указываются аргументы функции.

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

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

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

postfix-expression ( argument-expression-listopt )

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


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

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

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

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

Другие вопросы по тегам