在C语言(以及其他许多“低级”语言)中,函数都有一个类型。您可以使用与函数匹配的类型声明变量,也可以将函数赋值给这样的变量,但人们坚持认为函数不是C语言中的一等公民。
在C中的几个标准函数中,使用指向函数的指针并将函数作为参数传递给其他函数是关键;
例如,
要求
一个要传递的比较函数,否则它什么也做不了。
在C中看到“面向对象”编程并不少见,方法是声明一个
具有多个具有函数类型的变量。回调可以而且通常是(如果不总是--我无法想象有任何其他方式)使用带函数类型的变量或
%s包含具有函数类型的成员。
那么,为什么在C中函数不被认为是一等公民呢?
(我确信这是重复的,但我似乎在这里找不到任何类似的问题)
发布于 2018-01-04 17:29:49
有一个
Andreas Rossberg的回答真的很好
关于Scala的一个问题(几乎是重复的),它恰好解释了为什么C/C++中的函数不是第一类函数。引用:
作为“一流”并不是一个正式定义的概念,但它通常意味着一个实体具有三个属性:
它可以不受限制地在任何“普通”值可以使用的地方使用,例如,从函数传递和返回,放入容器等。
它可以不受限制地在任何“普通”值可以的地方构造,即,在本地,在表达式中,等等。
它可以以类似于“普通”值的方式进行类型化,即,有一个类型被分配给这样的实体,并且它可以与其他类型自由组合。
对于函数,(2)特别意味着局部函数可以使用作用域中的所有名称,即您有词法闭包。它还经常提供匿名形式的构造(例如匿名函数),但这并不是严格要求的(例如,如果语言具有足够通用的let表达式)。Point (3)在非类型化语言中是非常正确的。
..。
C/C++中的函数不是一流的。
虽然(1)和(3)可以通过函数指针获得,但函数本身不支持(2)。(这一点经常被忽视。)
重点矿
发布于 2021-03-01 07:14:19
在hnefatl的理论解释中增加了一个例子。在C中,int值是第一类。我们可以添加两个int值,创建一个新的int值:
int add(int a, int b)
{
return a + b;
}类似地,在Haskell中,我们可以组合两个函数(具有适当的类型)来创建一个新函数:
compose f g = f . gH= compose f g是满足h(x) = f(g(x))的函数。
据我所知,这样的操作不能用C语言完成。当然,在C中也可以通过其他方式达到同样的效果。但是我们不能像计算数字那样简单自然地计算新函数。
https://stackoverflow.com/questions/48092176
复制相似问题