所以我有以下表达式:
int (*f1(int(*a)(int, int))) (int, int);
我试图理解它,但它令人困惑。我发现“a”是一个指向函数的指针,它接受2个参数(int,int)。 然后f1似乎是另一个带有2个int参数的函数的指针。 但令我困惑的是f1与a的关系。
有人可以给我一些提示或正确解释上述表达方式的作用吗?
答案 0 :(得分: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)
答案 1 :(得分:6)
这是函数public class App
{
public static void main( String[] args )
{
SessionFactory sessionFactory = HibernateAnnotationUtil.getSessionFactory();
Session session = sessionFactory.openSession();
System.out.println("Session created");
Transaction tx = session.beginTransaction();
User user = new User();
user.setFirthName("Igor");
user.setLastName("Petrenko");
user.setNickName("6ruceVVayne");
user.setToken("somethink");
user.setRole(Role.ADMINISTRATOR);
session.save(user);
tx.commit();
System.out.println("User ID=" + user.getId());
}
}
的声明,它接受一个参数f1
- 一个指向函数的指针,它将2 a
s作为参数并返回int
- 和返回指向同一类型函数的指针。
使用typedef打破它:
int
答案 2 :(得分:4)
a
是f1
唯一参数的名称;当你删除它时,你可以使用https://cdecl.org/来破译整个声明:
将f1声明为函数(指向函数(int,int)的指针返回int) 返回指向函数(int,int)的指针返回int
所以f1
是一个功能。它需要一个函数指针(称为a
)并返回一个函数指针。
这两个函数指针都适用于需要两个int
并返回int
的函数。
以下是一个实际操作示例:
#include <iostream>
int passed(int x, int y) { std::cout << "passed\n"; return x * y; }
int returned(int x, int y) { std::cout << "returned\n"; return x + y; }
// a is redundant here, where we just declare f1:
int (*f1(int(*a)(int, int))) (int, int);
// but not here, where we define f1:
int (*f1(int(*a)(int, int))) (int, int)
{
std::cout << "f1\n";
int result_of_passed = a(10, 10);
std::cout << result_of_passed << '\n';
return returned;
}
int main()
{
int x = f1(passed)(10, 10);
std::cout << x << '\n';
}
输出:
f1
passed
100
returned
20
答案 3 :(得分:4)
C中的提示是读取一个声明,因为它是一个表达式。这就是这种着名的对称性,使C优雅。
如何阅读?遵循运营商优先规则:
*a
:如果我取消引用变量a
; (*a)(int,int)
:然后用两个整数调用它; int (*a)(int,int)
:然后我得到一个整数; 所以a
是一个指向函数的指针,该函数将两个int
作为参数并返回一个int。
然后:
f( int(*a)(int,int) )
如果我使用参数a
; *f( int(*a)(int,int) )
然后我取消引用结果; (*f( int(*a)(int,int) )(int,int)
然后使用2 int
作为参数调用此结果int (*f( int(*a)(int,int) )(int,int)
我收到int
所以f
是一个以a
为参数的函数,并返回一个指向函数的指针,该函数将两个int
作为参数并返回int
。所以f
返回类型与其参数返回类型相同。它可能更简单:
using ftype = int(*)(int,int);
ftype f( ftype a);