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

16

我正在尝试理解C语言的一些基础知识。KRC的《C程序设计语言》中说:

函数调用是后缀表达式,称为函数名,后跟包含可能为空的逗号分隔赋值表达式列表(Par.A7.17)的括号,这构成了函数的参数。

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

    () 是运算符吗?

    函数名是一个运算数吗?

    括号内的参数是运算数吗?

  2. 函数名是否等同于函数调用?

谢谢。


2
函数调用在黄色框中定义,显然它不是函数设计符号,即函数名称。 - Eugene Sh.
2个回答

11
在函数调用中,() 就像访问数组元素时 [] 一样是一个操作符。

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


3
正式语法定义绝对是初学者最需要的 :) - 0___________
2
Operand 本质上是 argument 的同义词。因此,*operand 也被称为“操作的一个输入量”*。 - Octopus
1
@PeterJ,也许是这样,但是OP的声望已经达到了23K,很难说是初学者。 - Octopus

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

3
顺便说一下,对于没有编写编译器需求的人来说,了解这些事情基本上是无用知识。 - Lundin
1
我想你可以把函数名称称作操作数。但这不是常见的做法:在函数调用的上下文中,“操作数”一词更常指参数列表中的每个表达式,是“参数”的同义词。C标准并不使用“操作数”来表示这个概念,也不用于宏参数或形参,但其他编程语言的规范会使用,比如Python。 - chqrlie
@chqrlie 因此,“我想” :) 我强调标准在这种情况下没有提到任何操作数。 - Lundin
注意§6.5.2.2 ¶1中所述:表示被调用函数的表达式(92)应具有指向返回void或返回完整对象类型(而非数组类型)的函数指针类型。 脚注92说:通常,这是将函数设计符转换为标识符的结果。 而且§6.3.2.1继续说明:除非它是sizeof运算符(65)或一元&运算符的操作数,否则带有类型“返回类型的函数”的函数设计符将被转换为具有类型“指向返回类型的函数的指针”的表达式。 - Jonathan Leffler
@JonathanLeffler:毫无疑问,函数设计者可以用作某些运算符的操作数,但这并不意味着它是函数调用运算符的操作数,后者也未被指定为这样。 - chqrlie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接