所以我有以下表达式:
int (*f1(int(*a)(int, int))) (int, int);
Run Code Online (Sandbox Code Playgroud)
而我正试图理解它,但它令人困惑.我发现"a"是一个指向函数的指针,它接受2个参数(int,int).然后f1似乎是另一个带有2个int参数的函数的指针.但令我困惑的是f1与a的关系.
有人可以给我一些提示或正确解释上面的表达是做什么的吗?
Hol*_*Cat 10
它声明f1为一个带有单个参数的函数a.参数和返回类型的类型都是"指向int返回两个参数的函数的指针int".
这是你解析它的方式:
// f1 is...
f1
// ...a function...
f1( )
// ...with a single parameter called `a`, which is...
f1( a )
// ...a pointer to...
f1( *a )
// (skip parentheses)
f1( (*a) )
// ...a function...
f1( (*a)( ))
// ...with two `int` parameters...
f1( (*a)(int, int))
// ...returning an `int`. The `f1` itself returns...
f1(int(*a)(int, int))
// ...a pointer to...
*f1(int(*a)(int, int))
// (skip parentheses)
(*f1(int(*a)(int, int)))
// ...a function...
(*f1(int(*a)(int, int))) ( )
// ...with two int parameters...
(*f1(int(*a)(int, int))) (int, int)
// ...returning an `int`.
int (*f1(int(*a)(int, int))) (int, int)
Run Code Online (Sandbox Code Playgroud)
这是函数的声明,f1它接受一个参数a- 一个指向函数的指针,该函数以2 ints作为参数并返回int- 并返回指向同一类型函数的指针.
用typedef打破它:
typedef int(*t)(int, int);
t f1(t a); //this is your declaration
Run Code Online (Sandbox Code Playgroud)
C 中的技巧是将声明当作表达式来阅读。这就是使 C 变得优雅的著名对称性。
如何阅读?遵循运算符优先规则:
*a:如果我取消引用变量a;(*a)(int,int): 然后用两个整数调用它;int (*a)(int,int): 然后我得到一个整数;a指向以两个ints 作为参数并返回一个 int的函数的指针也是如此。
然后:
f( int(*a)(int,int) )如果我用参数调用 f a;*f( int(*a)(int,int) ) 然后我取消引用结果;(*f( int(*a)(int,int) )(int,int)然后用 2int作为参数调用这个结果int (*f( int(*a)(int,int) )(int,int) 我得到一个 int所以f是一个函数获取a作为参数,并返回一个指向一个函数,需要两个intS作为参数,并返回一个int。因此f返回类型与其参数返回类型相同。它本来可以更简单:
using ftype = int(*)(int,int);
ftype f( ftype a);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
523 次 |
| 最近记录: |