gpt4 book ai didi

c - 函数指针、闭包和 Lambda

转载 作者:太空狗 更新时间:2023-10-29 16:15:29 26 4
gpt4 key购买 nike

我刚刚开始学习函数指针,当我阅读关于该主题的 K&R 章节时,第一个让我印象深刻的是,“嘿,这有点像闭包。”我知道这个假设在某种程度上是根本错误的,在网上搜索后,我没有找到任何关于这种比较的分析。

那么为什么 C 风格的函数指针与闭包或 lambda 有根本的不同呢?据我所知,这与函数指针仍然指向已定义(命名)函数的事实有关,而不是匿名定义函数的做法。

为什么将一个函数传递给一个函数在第二种情况下被认为比第一种情况更强大,在第二种情况下它是未命名的,而第一种情况下它只是传递一个普通的日常函数?

请告诉我为什么如此密切地比较两者是错误的。

最佳答案

lambda(或 closure)封装了函数指针和变量。这就是为什么在 C# 中,您可以执行以下操作:

int lessThan = 100;
Func<int, bool> lessThanTest = delegate(int i) {
return i < lessThan;
};

我在那里使用了一个匿名委托(delegate)作为闭包(它的语法比 lambda 等价物更清晰,更接近 C),它将 lessThan(堆栈变量)捕获到闭包中。当闭包被评估时,lessThan(其堆栈框架可能已被破坏)将继续被引用。如果我改变 lessThan,那么我改变比较:

int lessThan = 100;
Func<int, bool> lessThanTest = delegate(int i) {
return i < lessThan;
};

lessThanTest(99); // returns true
lessThan = 10;
lessThanTest(99); // returns false

在 C 中,这是非法的:

BOOL (*lessThanTest)(int);
int lessThan = 100;

lessThanTest = &LessThan;

BOOL LessThan(int i) {
return i < lessThan; // compile error - lessThan is not in scope
}

尽管我可以定义一个带两个参数的函数指针:

int lessThan = 100;
BOOL (*lessThanTest)(int, int);

lessThanTest = &LessThan;
lessThanTest(99, lessThan); // returns true
lessThan = 10;
lessThanTest(100, lessThan); // returns false

BOOL LessThan(int i, int lessThan) {
return i < lessThan;
}

但是,现在我在评估它时必须传递 2 个参数。如果我希望将此函数指针传递给 lessThan 不在范围内的另一个函数,我将不得不通过将其传递给链中的每个函数或将其提升为全局函数来手动使其保持事件状态。

虽然大多数支持闭包的主流语言都使用匿名函数,但并没有要求。您可以有没有匿名函数的闭包,也可以有没有闭包的匿名函数。

总结:闭包是函数指针+捕获变量的组合。

关于c - 函数指针、闭包和 Lambda,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/208835/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com