При вызове функции, что такое оператор и каковы операнды?
Я пытаюсь понять некоторые основы языка программирования Си на языке CRC.
Вызов функции - это постфиксное выражение, называемое указателем функции, за которым следуют круглые скобки, содержащие возможно пустой, разделенный запятыми список выражений присваивания (Par.A7.17), которые составляют аргументы функции.
При вызове функции, что такое оператор и каковы операнды?
Является
()
Оператор?Имя функции - операнд?
Есть аргументы внутри
()
Операнды?- Является ли указатель функции синонимом вызова функции?
Благодарю.
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
но нет вызова функции.