具有不同语义的函数调用

abc*_*abc 6 c function

考虑这个代码有3个不同的函数调用语义:

void f(void){
   puts("OK");
}

int main(void){
   f();
  (*f)();
  (&f)();

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

第一种是调用f的标准方式,

第二个是解除引用函数指针的语义,

但在第三个我将&运算符应用于函数名称,它似乎工作正常.

在第二和第三种情况下会发生什么?

谢谢.

Oli*_*rth 9

函数调用总是通过函数指针执行.从C99第6.5.2.2节:

表示被调用函数的表达式应具有指向函数的类型指针.

但是,几乎在所有情况下,函数类型都会衰减为函数指针类型.从C99第6.3.2.1节:

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

因此,您的三个调用将被评估:

(&f)();
(&(*(&f)))();
(&f)();
Run Code Online (Sandbox Code Playgroud)

一切都有效.但显然,第一个(f())是最干净,最容易阅读的.

  • @OliCharlesworth - 只有`&f`是一个r值,所以它不能是另一个`&`一元运算符的参数. (6认同)