【问题标题】:In a function call, what is the operator, and what are the operands?在函数调用中,什么是运算符,什么是操作数?
【发布时间】:2017-08-10 13:56:41
【问题描述】:

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

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

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

    ()是运营商吗?

    函数名是操作数吗?

    () 中的参数是操作数吗?

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

谢谢。

【问题讨论】:

  • 黄框中定义了函数调用,显然不是函数指示符,是函数名。

标签: c language-lawyer kernighan-and-ritchie function-call-operator


【解决方案1】:

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

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

【讨论】:

【解决方案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,但没有函数调用。

【讨论】:

  • 顺便说一句,知道这些东西对于不编写编译器的人来说几乎是无用的知识。
  • 我想你可以将函数名称为操作数。 这不是常见的做法:在函数调用的上下文中,单词 operand通常指定参数列表中的每个表达式,参数的同义词。 C 标准不为此使用 操作数,也不为宏参数或参数使用,但其他编程语言的规范使用,例如 Python。
  • @chqrlie 因此“我想” :) 我确实强调了标准在这种情况下没有提及任何操作数。
  • Note §6.5.2.2 ¶1 说:表示被调用函数 (92) 的表达式应具有指向返回 void 或返回数组类型以外的完整对象类型的函数的类型指针。 脚注 92 说:大多数情况下,这是转换作为函数指示符的标识符的结果。 §6.3.2.1 继续:除非它是sizeof 运算符,(65) 或一元 & 运算符,类型为“函数返回类型”的函数指示符被转换为类型为“指向函数返回类型的指针”的表达式。
  • @JonathanLeffler:毫无疑问,函数指示符可以用作某些运算符的操作数,但这不会使其成为函数调用运算符的操作数,也没有这样指定。
猜你喜欢
  • 2011-04-18
  • 1970-01-01
  • 2011-11-02
  • 2011-10-05
  • 1970-01-01
  • 2010-11-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多