首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么在C中函数不被认为是一等公民

为什么在C中函数不被认为是一等公民
EN

Stack Overflow用户
提问于 2018-01-04 17:25:04
回答 2查看 4.2K关注 0票数 9

在C语言(以及其他许多“低级”语言)中,函数都有一个类型。您可以使用与函数匹配的类型声明变量,也可以将函数赋值给这样的变量,但人们坚持认为函数不是C语言中的一等公民。

在C中的几个标准函数中,使用指向函数的指针并将函数作为参数传递给其他函数是关键;

例如,

要求

一个要传递的比较函数,否则它什么也做不了。

在C中看到“面向对象”编程并不少见,方法是声明一个

具有多个具有函数类型的变量。回调可以而且通常是(如果不总是--我无法想象有任何其他方式)使用带函数类型的变量或

%s包含具有函数类型的成员。

那么,为什么在C中函数不被认为是一等公民呢?

(我确信这是重复的,但我似乎在这里找不到任何类似的问题)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-01-04 17:29:49

有一个

Andreas Rossberg的回答真的很好

关于Scala的一个问题(几乎是重复的),它恰好解释了为什么C/C++中的函数不是第一类函数。引用:

作为“一流”并不是一个正式定义的概念,但它通常意味着一个实体具有三个属性:

它可以不受限制地在任何“普通”值可以使用的地方使用,例如,从函数传递和返回,放入容器等。

它可以不受限制地在任何“普通”值可以的地方构造,即,在本地,在表达式中,等等。

它可以以类似于“普通”值的方式进行类型化,即,有一个类型被分配给这样的实体,并且它可以与其他类型自由组合。

对于函数,(2)特别意味着局部函数可以使用作用域中的所有名称,即您有词法闭包。它还经常提供匿名形式的构造(例如匿名函数),但这并不是严格要求的(例如,如果语言具有足够通用的let表达式)。Point (3)在非类型化语言中是非常正确的。

..。

C/C++中的函数不是一流的。

虽然(1)和(3)可以通过函数指针获得,但函数本身不支持(2)。(这一点经常被忽视。)

重点矿

票数 19
EN

Stack Overflow用户

发布于 2021-03-01 07:14:19

在hnefatl的理论解释中增加了一个例子。在C中,int值是第一类。我们可以添加两个int值,创建一个新的int值:

代码语言:javascript
复制
int add(int a, int b)
 {
   return a + b;
 }

类似地,在Haskell中,我们可以组合两个函数(具有适当的类型)来创建一个新函数:

代码语言:javascript
复制
compose f g = f . g

H= compose f g是满足h(x) = f(g(x))的函数。

据我所知,这样的操作不能用C语言完成。当然,在C中也可以通过其他方式达到同样的效果。但是我们不能像计算数字那样简单自然地计算新函数。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48092176

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档