user-0 提问: 求大神解释signal（）函数的声明。

回复:
user: user-1
content: SYNOPSIS      #include <signal.h>       void (*      signal(int sig, void (*func)(int)))(int);       or in the equivalent but easier to read typedef'd version:       typedef void (*sig_t) (int);       sig_t      signal(int sig, sig_t func);

user: user-2
content: void * (signal(int sig, void (*fp)(int)))(int) 这个定义本来就不对  [root@localhost src]# gcc tmp.c tmp.c:21: error: ‘signal’ declared as function returning a function tmp.c: In function ‘signal’: tmp.c:22: warning: return makes integer from pointer without a cast [root@localhost src]#  编译器认为signal是一个函数，并且返回值也是一个函数。C语言不允许返回值是一个函数。 附：signal返回一个函数，函数的类型是 void* (int)，不是返回一个函数指针！

user: user-0
content: 那赵老师，我从网上找的代码：

user: user-0
content: 引用 6 楼 jwj070524 的回复:根据C语言操作符的优先级来看：最里面void (*func) (int)，func是一个函数指针变量；int sig，sig是一个变量；然后它们被()包围，表示它们是函数的参数。signal(int sig, void (*func)(int))，而且它们是signal函数的参数。既然是函数，那么一定会有返回值，signal函数左边是一个*，右边是一个()。括号（函数调用）优先级高于*（指针），但是由于*和signal同在一个括号内，优先级逆转，signal函数返回一个指针。为了清楚起见，把signal(int sig, void (*func)(int))看成一个整体，就叫A吧，变换后成为 void (*A)(int) 这下清楚了吧，A的返回值是一个指针（被括号包住了），然后左边是void，右边是(int)，括号优先级还是最高，表示A的返回值是一个函数指针，函数指针的参数是int，那么函数指针的返回值就是void了。 总结：signal是一个函数，参数是int和void (*func) (int)，signal函数的返回值是一个函数指针，该指针指向的函数参数为int，返回值是void  那如果改变一下呢： 什么情况下那个*指的是函数指针而不是返回值呢？  引用 6 楼 jwj070524 的回复:根据C语言操作符的优先级来看：最里面void (*func) (int)，func是一个函数指针变量；int sig，sig是一个变量；然后它们被()包围，表示它们是函数的参数。signal(int sig, void (*func)(int))，而且它们是signal函数的参数。既然是函数，那么一定会有返回值，signal函数左边是一个*，右边是一个()。括号（函数调用）优先级高于*（指针），但是由于*和signal同在一个括号内，优先级逆转，signal函数返回一个指针。为了清楚起见，把signal(int sig, void (*func)(int))看成一个整体，就叫A吧，变换后成为 void (*A)(int) 这下清楚了吧，A的返回值是一个指针（被括号包住了），然后左边是void，右边是(int)，括号优先级还是最高，表示A的返回值是一个函数指针，函数指针的参数是int，那么函数指针的返回值就是void了。 总结：signal是一个函数，参数是int和void (*func) (int)，signal函数的返回值是一个函数指针，该指针指向的函数参数为int，返回值是void   那如果改变一下：void *（signal (int sig,void (*func) (int)))(int)，先不说在实际中的意义，仅仅说理论上的意义：（）比*的优先级高，那么这个声明的意思就是：返回值是一个函数指针，函数指针所指向的函数有一个参数int，函数指针指向的函数的返回值是void*类型的？

user: user-0
content: 引用 3 楼 zhao4zhong1 的回复:仅供参考//char (*(*x[3])())[5];//x是什么类型的变量? // //分析C语言声明，关键是搞清楚这个变量是个什么东西（函数、指针、数组）， //是函数那么剩下的就是他的参数和返回值， //是指针那剩下部分是说明他指向什么， //是数组剩下的部分就是说明数组的成员是什么类型。 //解析C语言声明规则： //从左侧第一个标识符开始，按照优先级进行结合。*表示是..的指针，const表示只读的，volatile表示可变的，[]表示是数组，()表示是函数。 // //x和[3]结合说明是一个大小为3的数组，该数组的每个元素为一类指针，该类指针指向一类函数，该类函数无参数，返回一类指针，该类指针指向一个大小为5的char型数组 #include <stdio.h> #include <typeinfo.h> char num[5]; char (*x00())[5] {     return # } int main() {     char (*x000)[5];//返回值     char (*(x00)())[5];//函数原型，参数为空，返回值为指针     char (*(*x0)())[5];//数组的元素，是个函数指针     char (*(*x[3])())[5];//是个数组，大小为3      x0 = x00;     x[0] = x0;     x[1] = x0;     x[2] = x0;     printf("typeid(x).name() is %s\n",typeid(x).name());     return 0; } //typeid(x).name() is char (* (__cdecl**)(void))[5]     赵老师，我是不是可以这么理解呢：   char (*x000)[5] 这个是指针，指向5个char型的字符串；   char (*(x00)())[5] 这是一个函数，返回值是char （*  ）[5];   char (*(*x0)())[5]这是一个函数指针，返回值是char （ *  ）[5];   char (*(*x[3])())[5]这是一个函数指针数组，返回值是char （*  ）[5]; 这里的char （* ）[5]指的是一个指向 五个char型元素的指针吧，我在看c专家编程，根据里边的声明的优先级别解释这个char （* ）[5]解释的通。

user: user-2
content: 根据C语言操作符的优先级来看：最里面void (*func) (int)，func是一个函数指针变量；int sig，sig是一个变量；然后它们被()包围，表示它们是函数的参数。signal(int sig, void (*func)(int))，而且它们是signal函数的参数。既然是函数，那么一定会有返回值，signal函数左边是一个*，右边是一个()。括号（函数调用）优先级高于*（指针），但是由于*和signal同在一个括号内，优先级逆转，signal函数返回一个指针。为了清楚起见，把signal(int sig, void (*func)(int))看成一个整体，就叫A吧，变换后成为 void (*A)(int) 这下清楚了吧，A的返回值是一个指针（被括号包住了），然后左边是void，右边是(int)，括号优先级还是最高，表示A的返回值是一个函数指针，函数指针的参数是int，那么函数指针的返回值就是void了。 总结：signal是一个函数，参数是int和void (*func) (int)，signal函数的返回值是一个函数指针，该指针指向的函数参数为int，返回值是void

user: user-0
content: 引用 1 楼 T5500 的回复:返回函数指针的函数，指向一个具有一个int型形参、返回类型为void的函数  为什么是这样呢？

user: user-3
content: 我还有很多不知道的知识。。。

user: user-4
content: 仅供参考//char (*(*x[3])())[5];//x是什么类型的变量? // //分析C语言声明，关键是搞清楚这个变量是个什么东西（函数、指针、数组）， //是函数那么剩下的就是他的参数和返回值， //是指针那剩下部分是说明他指向什么， //是数组剩下的部分就是说明数组的成员是什么类型。 //解析C语言声明规则： //从左侧第一个标识符开始，按照优先级进行结合。*表示是..的指针，const表示只读的，volatile表示可变的，[]表示是数组，()表示是函数。 // //x和[3]结合说明是一个大小为3的数组，该数组的每个元素为一类指针，该类指针指向一类函数，该类函数无参数，返回一类指针，该类指针指向一个大小为5的char型数组 #include <stdio.h> #include <typeinfo.h> char num[5]; char (*x00())[5] {     return # } int main() {     char (*x000)[5];//返回值     char (*(x00)())[5];//函数原型，参数为空，返回值为指针     char (*(*x0)())[5];//数组的元素，是个函数指针     char (*(*x[3])())[5];//是个数组，大小为3      x0 = x00;     x[0] = x0;     x[1] = x0;     x[2] = x0;     printf("typeid(x).name() is %s\n",typeid(x).name());     return 0; } //typeid(x).name() is char (* (__cdecl**)(void))[5]

user: user-5
content: //C++11可以使用尾置返回类型的语法写出等价的声明，看起来会比较好理解一点 auto signal(int sig, void (*func)(int)) -> void(*) (int);

user: user-5
content: 返回函数指针的函数，指向一个具有一个int型形参、返回类型为void的函数