T*******x 发帖数: 8565 | 1 下面程序中的ff是如何工作的?
char *fa()
{
return "hello world";
}
char *(*ff(char *(*fb)()))()
{
return fb;
}
int main()
{
printf("%s\n", (*ff)(fa)());
} |
t****t 发帖数: 6806 | 2 just use cdecl to "explain" it and you get the result.
【在 T*******x 的大作中提到】 : 下面程序中的ff是如何工作的? : char *fa() : { : return "hello world"; : } : char *(*ff(char *(*fb)()))() : { : return fb; : } : int main()
|
h****8 发帖数: 599 | |
d***i 发帖数: 344 | 4 ...打回去重新看
【在 h****8 的大作中提到】 : ff不就是一个以函数指针为形参的函数指针么
|
z****e 发帖数: 2024 | 5 不懂这个
char *(*ff(char *(*fb)()))()
{
return fb;
}
char *( *ff(相同类型函数指针) )()//怎么后面接着就给函数定义了?
{
return fb;
}
这个定义是定义什么?难道是函数指针?
{
return fb;
} |
y***d 发帖数: 2330 | 6 ff
ff() ff 是一个函数
*ff() ff 返回一个指针
*ff(xxx) ff 的参数是 xxx
(*ff())() ff 返回的指针指向一个函数
char *(*ff())() 这个函数的返回返回值是 char *
* () 的优先级问题
【在 z****e 的大作中提到】 : 不懂这个 : char *(*ff(char *(*fb)()))() : { : return fb; : } : char *( *ff(相同类型函数指针) )()//怎么后面接着就给函数定义了? : { : return fb; : } : 这个定义是定义什么?难道是函数指针?
|
j***i 发帖数: 1278 | 7 try 了 char *(*ff(char *(*fb)()))()
syntax error
【在 t****t 的大作中提到】 : just use cdecl to "explain" it and you get the result.
|
t******s 发帖数: 119 | 8 en
【在 j***i 的大作中提到】 : try 了 char *(*ff(char *(*fb)()))() : syntax error
|
t****t 发帖数: 6806 | 9 把fb去掉再来, cdecl不接受参数名, 比如说
cdecl> explain char foo(char)
declare foo as function (char) returning char
cdecl> explain char foo(char x)
syntax error
所以
cdecl> explain char *(*ff(char *(*)()))()
declare ff as function (pointer to function returning pointer to char)
returning pointer to function returning pointer to char
【在 j***i 的大作中提到】 : try 了 char *(*ff(char *(*fb)()))() : syntax error
|
d***i 发帖数: 344 | 10 re!
【在 t****t 的大作中提到】 : 把fb去掉再来, cdecl不接受参数名, 比如说 : cdecl> explain char foo(char) : declare foo as function (char) returning char : cdecl> explain char foo(char x) : syntax error : 所以 : cdecl> explain char *(*ff(char *(*)()))() : declare ff as function (pointer to function returning pointer to char) : returning pointer to function returning pointer to char
|
|
|
j***i 发帖数: 1278 | 11 master 谢谢
【在 t****t 的大作中提到】 : 把fb去掉再来, cdecl不接受参数名, 比如说 : cdecl> explain char foo(char) : declare foo as function (char) returning char : cdecl> explain char foo(char x) : syntax error : 所以 : cdecl> explain char *(*ff(char *(*)()))() : declare ff as function (pointer to function returning pointer to char) : returning pointer to function returning pointer to char
|
T*******x 发帖数: 8565 | 12 这道题我的意图是要定义一个函数ff,
接受一个函数指针作为参数,然后返回一个函数指针。
用typedef表达就是这样的:
typedef char *(*FPtr)();
FPtr ff(FPtr fb)
{
return fb;
}
如果不用typedef,展开之后就是下面的样子。
【在 T*******x 的大作中提到】 : 下面程序中的ff是如何工作的? : char *fa() : { : return "hello world"; : } : char *(*ff(char *(*fb)()))() : { : return fb; : } : int main()
|
t****t 发帖数: 6806 | 13 你这又不是什么新鲜问题, UNIX里很早就有这样的API了.
void (*signal(int sig, void (*func)(int)))(int);
【在 T*******x 的大作中提到】 : 这道题我的意图是要定义一个函数ff, : 接受一个函数指针作为参数,然后返回一个函数指针。 : 用typedef表达就是这样的: : typedef char *(*FPtr)(); : FPtr ff(FPtr fb) : { : return fb; : } : 如果不用typedef,展开之后就是下面的样子。
|
T*******x 发帖数: 8565 | 14 出个小题玩玩而已:)
【在 t****t 的大作中提到】 : 你这又不是什么新鲜问题, UNIX里很早就有这样的API了. : void (*signal(int sig, void (*func)(int)))(int);
|
h****8 发帖数: 599 | 15 哪里错了 楼下都说了
declare ff as function (pointer to function returning pointer to char)
returning pointer to function returning pointer to char
【在 d***i 的大作中提到】 : ...打回去重新看
|
t****t 发帖数: 6806 | 16 但是你不是这么说的.
【在 h****8 的大作中提到】 : 哪里错了 楼下都说了 : declare ff as function (pointer to function returning pointer to char) : returning pointer to function returning pointer to char
|
d***i 发帖数: 344 | 17 ......ft
你抬头看看你自己的上一贴,再看这个。ff是个函数,不是函数指针。。。哎。。。你
也许是笔误吧。。。
【在 h****8 的大作中提到】 : 哪里错了 楼下都说了 : declare ff as function (pointer to function returning pointer to char) : returning pointer to function returning pointer to char
|
d***i 发帖数: 344 | 18 嗯,当时看到这个还是问了guru才弄明白的。。。
想起那个时候,学了一个学期c,去看linux的一些代码,居然觉得跟天书一样,哈哈~
【在 t****t 的大作中提到】 : 你这又不是什么新鲜问题, UNIX里很早就有这样的API了. : void (*signal(int sig, void (*func)(int)))(int);
|
p***o 发帖数: 1252 | 19 其实也不能怪你不明白,那么写是给compiler看的,人看的
还是用typedef把。
【在 d***i 的大作中提到】 : 嗯,当时看到这个还是问了guru才弄明白的。。。 : 想起那个时候,学了一个学期c,去看linux的一些代码,居然觉得跟天书一样,哈哈~
|
T*******x 发帖数: 8565 | 20 同意。
【在 p***o 的大作中提到】 : 其实也不能怪你不明白,那么写是给compiler看的,人看的 : 还是用typedef把。
|
|
|
h****8 发帖数: 599 | 21 哦 是错了
那为什么是函数不是函数指针 他后面Main里调用的时候还是(*ff)的不是么
【在 d***i 的大作中提到】 : ......ft : 你抬头看看你自己的上一贴,再看这个。ff是个函数,不是函数指针。。。哎。。。你 : 也许是笔误吧。。。
|
p***o 发帖数: 1252 | 22 一回事,你写ff(fa)()也行。
【在 h****8 的大作中提到】 : 哦 是错了 : 那为什么是函数不是函数指针 他后面Main里调用的时候还是(*ff)的不是么
|
t****t 发帖数: 6806 | 23 this is redundant, you can write the call as
ff(fa)()
for example, fa() is equivalent to (*fa)(), since fa (function) can be impli
citly cast to pointer-to-function, then dereferenced (by *) to the original
function.
i think OP just want to make it obscure.
【在 h****8 的大作中提到】 : 哦 是错了 : 那为什么是函数不是函数指针 他后面Main里调用的时候还是(*ff)的不是么
|
t****t 发帖数: 6806 | 24 ft, your post so short, faster than me.
【在 p***o 的大作中提到】 : 一回事,你写ff(fa)()也行。
|
p***o 发帖数: 1252 | 25 I am 30 min late already ...
【在 t****t 的大作中提到】 : ft, your post so short, faster than me.
|
t****t 发帖数: 6806 | 26 no one keep watching this board anyway.
【在 p***o 的大作中提到】 : I am 30 min late already ...
|
p***o 发帖数: 1252 | 27
impli
original
对,把人当parser用没意义。
【在 t****t 的大作中提到】 : this is redundant, you can write the call as : ff(fa)() : for example, fa() is equivalent to (*fa)(), since fa (function) can be impli : citly cast to pointer-to-function, then dereferenced (by *) to the original : function. : i think OP just want to make it obscure.
|
h****8 发帖数: 599 | 28 oic. thx
impli
original
【在 t****t 的大作中提到】 : this is redundant, you can write the call as : ff(fa)() : for example, fa() is equivalent to (*fa)(), since fa (function) can be impli : citly cast to pointer-to-function, then dereferenced (by *) to the original : function. : i think OP just want to make it obscure.
|
T*******x 发帖数: 8565 | 29 这个我还真不知道,并不是想使问题更加obscure。
fa()本不应该和(*fa)()等效----逻辑上似乎不自然。
当然从函数指针赋值的方法来看,它们就是等效的。
这个地方不完全符合逻辑,这是C得处理方法。
impli
original
【在 t****t 的大作中提到】 : this is redundant, you can write the call as : ff(fa)() : for example, fa() is equivalent to (*fa)(), since fa (function) can be impli : citly cast to pointer-to-function, then dereferenced (by *) to the original : function. : i think OP just want to make it obscure.
|
d***i 发帖数: 344 | 30 嗯,我看到这个调用的时候也咯噔了一下,还把代码试了一下。
【在 T*******x 的大作中提到】 : 这个我还真不知道,并不是想使问题更加obscure。 : fa()本不应该和(*fa)()等效----逻辑上似乎不自然。 : 当然从函数指针赋值的方法来看,它们就是等效的。 : 这个地方不完全符合逻辑,这是C得处理方法。 : : impli : original
|
|
|
n******t 发帖数: 4406 | 31
~~~~~~~~~~~~~~~~
这是对于人的逻辑不自然,
对compiler来说挺自然的。
【在 T*******x 的大作中提到】 : 这个我还真不知道,并不是想使问题更加obscure。 : fa()本不应该和(*fa)()等效----逻辑上似乎不自然。 : 当然从函数指针赋值的方法来看,它们就是等效的。 : 这个地方不完全符合逻辑,这是C得处理方法。 : : impli : original
|
T*******x 发帖数: 8565 | 32 fa==*fa => fa==*fa==**fa==***fa ...
这是C语言对于函数类型单独的处理方法,和其他的类型的处理方法不同。
对于compiler为什么自然呢?
【在 n******t 的大作中提到】 : : ~~~~~~~~~~~~~~~~ : 这是对于人的逻辑不自然, : 对compiler来说挺自然的。
|