【问题标题】:What is function designator and actual call?什么是函数指示符和实际调用?
【发布时间】:2020-09-20 20:39:20
【问题描述】:

根据 C99 标准:

函数指示符、实际参数和实际参数中的子表达式的求值顺序未指定,但在实际调用之前有一个顺序点。

谁能解释清楚什么是函数指示符和实际调用?它们之间有什么区别?

【问题讨论】:

  • 我想你已经知道电话是什么了,但是很困惑。功能指示符是需要解释的。
  • 我知道调用是什么,但我认为实际调用可能会有所不同,例如实际参数和形式参数之间的差异。

标签: c function arguments language-lawyer c99


【解决方案1】:

函数指示符是具有函数类型的表达式。也就是说,当您键入func(a,b); 调用函数时,func 是函数指示符。

(当出现在表达式中时,这样的函数指示符通常会“衰减”为指向函数的指针,就像数组衰减为指向第一个元素的指针一样。)

“实际调用之前的序列点”的意思是在调用函数之前必须对所有操作数进行完全评估(执行)。 如果您有func(a(), b()),则不确定是先执行a() 还是b(),但您知道它们肯定会在调用func 之前执行。

因此,例如,如果 a() 修改了一个也被 func 使用的全局变量,那会很好,因为对该变量的访问将按照明确定义的顺序进行排序。

【讨论】:

  • 那么,你能举一个函数指示符评估的例子吗?
  • @UlaşSezgin 这是一个和其他操作数一样的操作数,但不是一个非常令人兴奋的操作数。不过,您也可以使用函数指针,在这种情况下,它可能每次都指向不同的函数。
【解决方案2】:

我会假设函数指示符告诉程序调用哪个函数。它可能是函数名或导致函数指针的表达式。

编辑:

这是一个函数指针示例:

// Two random functions
int foo(int i);
int bar(int i);

// define a function pointer type
typedef int (* func)(int)

// Array of functions

func a[] = {foo, bar}


// calling bar(123)
// (a[1]) is an expression that evaluates to a pointer to `bar`

(a[1])(123);

【讨论】:

  • 如果它只是一个名称,c99 是什么意思作为“函数指示符的评估”
  • @UlaşSezgin,因为它并不总是在编译时确定的名称。它也可能是在运行时评估以确定要调用哪个函数的表达式。我建议您尝试了解函数指针。
  • 你为什么会假设?这是在 C 标准中定义的:“function designator 是具有函数类型的表达式……”(C 2018 6.3.2.1 4)。指针不是函数指示符。我建议您尝试了解函数指示符。
  • @EricPostpischil 我“假设”是因为我面前没有标准文本。然后我还假设由于发布者要求解释并且显然还没有了解函数指针,因此更务实的答案会比枯燥的 c 标准引号更合适。
【解决方案3】:

"什么是函数指示符?"


函数指示符是具有函数类型的表达式。除非它是 sizeof 运算符 66) 或一元 & 运算符的操作数,否则类型为“函数返回类型”的函数指示符将转换为类型为“指向函数返回类型的指针”的表达式。

66) 因为没有发生这种转换,所以 sizeof 运算符的操作数仍然是一个函数指示符,并且违反了 6.5.3.4 中的约束。

来源:C18,§6.3.2.1/4 -“左值、数组和函数指示符”


函数指示符是一个表达式,它标识某个函数并且在计算时指定一个函数。

int tip (int);

tip(函数的名称)例如是函数指示符。

或者例如在:

#include <stdio.h>

int tip (int a) {
    return a;
}

int main (void) {

    int (**foo)(int);

    int (*bar[5])(int);

    bar[0] = &tip;

    foo = &bar;

    printf("%d", (**foo)(4));
}

指向返回int的函数的指针foo - (**foo)(4) - 是函数tip的函数指示符。


"函数调用是什么?"

函数调用实际上只是对函数的调用,比如tip(4);

【讨论】:

  • 你能举一个函数指示符的例子吗?
  • @UlaşSezgin 是的,做到了。
猜你喜欢
  • 2013-09-09
  • 2011-03-14
  • 2018-02-21
  • 2013-05-14
  • 2019-06-17
  • 1970-01-01
  • 2022-01-21
  • 1970-01-01
  • 2013-02-14
相关资源
最近更新 更多