如果您能理解不完整的代码,请解释我用感叹号标记的行中发生的情况
#include <stdio.h>
void quicksort(int (*comp)()){
printf("lalal\n");
}
int first()
{
return 1;
}
int second(){
return 1;
}
int main()
{
int a;
a = getchar();
quicksort((int (*)()(a ? first : second)); /* !!!!!! */
return 0;
}
在我看来,正在创建指向其中一个函数的指针。其中一个选项是这样的(如果我错了,请解释会发生什么)
quicksort( int (*first)())
实际上,您最终将函数指针(两个之一,取决于 的值
a
)转换为指向 的指针int
,该指针被传递给函数quicksort
。但是如果你想通过指针调用函数,那么声明
quicksort
必须不同:在这里,你可以看看这里。如果您对挑战不感兴趣-对不起,那么我就跑了...
你的功能
用类型参数声明
int *
,即 你的声明是等价的并且您的版本中的括号
(*comp)
只是多余的,不会影响任何东西。同理,
int (*)
调用这个函数时的类型转换是一种普通的指针类型
int *
,在描述中有人只是简单地添加了不必要的括号,这些括号不会影响任何事情。表达式的结果
a ? first : second
有一个类型int (*)()
——一个指向函数的指针。因此,上面的类型转换是将函数指针强制转换为 typeint *
。标准 C 不支持此类指针之间的转换。数据指针只能转换为数据指针。函数指针 - 仅指向函数指针。如果你想得到
quicksort
一个函数指针作为你的参数,那么这真的可以像这样完成之后,您将不再需要在调用时进行类型转换
但是,我不建议您
()
在函数声明中不必要地使用这种语言特性作为空参数列表。如果您的函数不应该有参数,则将其显式指定(void)
为参数列表