16

我正在尝试了解 C 的一些基础知识。KRC 的 The C Programming Language 说

函数调用是一个后缀表达式,称为函数指示符,后跟括号,其中包含可能为空的、以逗号分隔的赋值表达式列表 (Par.A7.17),它们构成函数的参数。

  1. 在函数调用中,什么是运算符,什么是操作数?

    ()运营商吗?

    函数名是操作数吗?

    参数是否在()操作数内?

  2. 函数指示符是函数调用的同义词吗?

谢谢。

4

2 回答 2

11

在函数调用中,()is 运算符就像[]访问数组元素时的运算符一样。

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 标准,表达式列表指定函数的参数。

于 2017-08-10T14:04:34.730 回答
5

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但没有函数调用的示例。

于 2017-08-10T14:15:52.670 回答