前言

先来啰嗦几句,身边的朋友,同事都喜欢在博客上记录自己在学习计算机编程技术路程上的一些问题和心得。就我个人而言,这是个好习惯,特别是在计算机编程领域,技术方向种类繁多,永无止境。所以,我也开始我人生中第一份博客,希望看到的朋友多多鼓励和讨论,在此谢过。对于计算技术,越是深入越越数学挂钩,想达到大神级别,嗯,我是有自知之明的。计算机技术虽然之多,并不需要我们每一个领域每一项技术都特别的精通。当然,能做到,我由衷的佩服和羡慕,只要我们专注于某些技术领域并能达到“精通”两个字就已经很不容易,毕竟精神和身体耗损太大,一般人难以达到包罗万象。个人特别喜欢C语言,用其研发已有6年多的时间,一直很热衷。下面就由读者和我一起来看看使用C语言实现Lambda表达式(gcc编译器)。

什么是Lambda表达式

“Lambda 表达式”(Lambda Expression)是一个匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambda abstraction),是一个匿名函数,即没有函数名的函数。Lambda表达式可以表示闭包(注意和数学传统意义上的不同)。

C-Lambda表达式(gcc)

C语言实现Lambda表达式,一般来说都是通过宏定义来的,这样就可以使用类似Lambda(...)这样形式,请看下面:

#define cgs_lambda( return_type, function_body) \

({return_type cgs_lambda_func function_body cgs_lambda_func;})

上述,就是Lambda表达式的宏定义,“cgs_”前缀是我在自己的项目中使用的,不是重点。重点在于( return_type, function_body)使用在({return_type cgs_lambda_func function_body cgs_lambda_func;})语句,return_type为返回类型,function_body为Lambda表达式中匿名函数的函数体。注意,中间cgs_lambda_func其实就是匿名的函数名,最后的cgs_lambda_func的作用表示函数的地址就定义在此,如何使用cgs_lambda表达式,我们通过一个简单的实例做进一步分析。

使用C-Lambda表达式

完整代码如下:

#include <stdio.h>

/** 这里是我们定义的Lambda表达式的宏定义 */

#define cgs_lambda( return_type, function_body) \

({return_type cgs_lambda_func function_body cgs_lambda_func;})

/*************************** 测试Main **************************/

int main( int argc, const char **argv)

{

  /** 我们做两个数相加的操作 */

printf( "Sum = %d\n", cgs_lambda( int, (int x, int y){ return x + y; })(3, 4) );

  return 0;

}

可以通过编译和运行试试,运行结果为:Sum = 7

好了,我们来讲解一下,return_type为int型,function_body为带两个入参的函数体(int x, int y){ return x + y; },后面的(3, 4)就是我们调用cgs_lambda_func传的入参。这样应该知道cgs_lambda表达式中最有一个“cgs_lambda_func;”的作用了,别忘了末尾的分号“;",否则编译不过去的。

我们来翻译上述我们示例中的cgs_lambda表达式编译过后是什么样子,如下:

({int cgs_lambda_func (int x, int y){ return x + y; } cgs_lambda_func;})(3, 4)

简单剖析,“函数声明--->立即传参调用”,代码块由“({”和“})”括住,其实作用域也就是仅限于“({”和“})”之间,达到局部的作用。引入访问外部变量的例子:

#include <stdio.h>

/** 这里是我们定义的Lambda表达式的宏定义 */

#define cgs_lambda( return_type, function_body) \

({return_type cgs_lambda_func function_body cgs_lambda_func;})

/*************************** 测试Main **************************/

int main( int argc, const char **argv)

{

int a = 1;

  /** 我们做两个数相加的操作 */

printf( "Sum = %d\n", cgs_lambda( int, (int x, int y){ a++; return x + y; })(a, 4) );

printf( "a = %d\n", a);

  return 0;

}

结束语

非常感谢读者的耐心细读,我会慢慢更新我的博客,也会做好我的博客,最近自己在忙于写网络服务器方面的小型框架,谢谢您的关注,祝您身体健康,万事如意。

Lambda表达式(C语言-gcc编译器)的更多相关文章

  1. Java8特性详解 lambda表达式 Stream

    1.lambda表达式 Java8最值得学习的特性就是Lambda表达式和Stream API,如果有python或者javascript的语言基础,对理解Lambda表达式有很大帮助,因为Java正 ...

  2. lambda表达式2

    1.lambda表达式 Java8最值得学习的特性就是Lambda表达式和Stream API,如果有python或者javascript的语言基础,对理解Lambda表达式有很大帮助,因为Java正 ...

  3. Java8之lambda表达式

    一.什么是lambda表达式? Lambda 是一个匿名函数,我们可以把 Lambda 表达式理解为是一段可以传递的代码(将代码像数据一样进行传递).可以写出更简洁.更灵活的代码.作为一种更紧凑的代码 ...

  4. C#复习笔记(4)--C#3:革新写代码的方式(Lambda表达式和表达式树)

    Lambda表达式和表达式树 先放一张委托转换的进化图 看一看到lambda简化了委托的使用. lambda可以隐式的转换成委托或者表达式树.转换成委托的话如下面的代码: Func<string ...

  5. Java 8 Lambda表达式介绍

    Lambda是什么? Lambda是一个匿名函数,我们可以把Lambda理解为是一段可以传递的代码.可以写出简洁.灵活的代码.作为一种更紧凑的代码风格,使java的语言表达能力得到提升. 可以这么说l ...

  6. JDK1.8中的Lambda表达式和Stream

    1.lambda表达式 Java8最值得学习的特性就是Lambda表达式和Stream API,如果有python或者javascript的语言基础,对理解Lambda表达式有很大帮助,因为Java正 ...

  7. Java8特性详解 lambda表达式 Stream【转】

    本文转自http://www.cnblogs.com/aoeiuv/p/5911692.html 1.lambda表达式 Java8最值得学习的特性就是Lambda表达式和Stream API,如果有 ...

  8. lambda表达式笔记

    前几天一位好友分享了一篇文章,其中讲到了lambda表达式,正好最近看了一些内容,就做做笔记吧... lambda表达式服务于函数式接口,如果需要一个函数式接口的对象时,就可以用lambda表达式代替 ...

  9. Java8初体验(一)lambda表达式语法

    感谢同事[天锦]的投稿.投稿请联系 tengfei@ifeve.com 本文主要记录自己学习Java8的历程,方便大家一起探讨和自己的备忘.因为本人也是刚刚开始学习Java8,所以文中肯定有错误和理解 ...

随机推荐

  1. 在eclipse里卸载已安装的插件[例如Android Development Tools ADT]

    在eclipse里卸载已安装的插件                                        有四种方法: 1.到plugins和features目录中找到你要卸载的插件的文件夹, ...

  2. Linux Kernel 整数溢出漏洞

    漏洞名称: Linux Kernel 整数溢出漏洞 CNNVD编号: CNNVD-201311-062 发布时间: 2013-11-07 更新时间: 2013-11-07 危害等级:    漏洞类型: ...

  3. [转] 网络流算法--Ford-Fulkerson方法及其多种实现

    网络流 转载自:http://www.cnblogs.com/luweiseu/archive/2012/07/14/2591573.html 在上一章中我们讨论的主题是图中顶点之间的最短路径,例如公 ...

  4. apache开源项目--kafka

    kafka是一种高吞吐量的分布式发布订阅消息系统,她有如下特性: 通过O(1)的磁盘数据结构提供消息的持久化,这种结构对于即使数以TB的消息存储也能够保持长时间的稳定性能. 高吞吐量:即使是非常普通的 ...

  5. android WebViewClient的方法解释

    1.在点击请求的是链接是才会调用,重写此方法返回true表明点击网页里面的链接还是在当前的webview里跳转,不跳到浏览器那边. public boolean shouldOverrideUrlLo ...

  6. Android 所有颜色代码

    colors.xml <?xml version="1.0" encoding="utf-8" ?> <resources> <c ...

  7. qosort 使用使用小例子

    输入 1500 3150 300100 200 输出结果470 471100    200150    300470    471     #include <iostream> #inc ...

  8. WordPress模版结构

    一套完整的WordPress模版应至少包括如下文件: style.css : 样式表文件 index.php : 首页模板 archive.php : 文章归档/分类目录模板 404.php : 40 ...

  9. 文件同步工具BT Sync介绍和使用说明

    BT Sync介绍 BT 下载,相信大伙儿都知道的.今儿个要介绍的 BT Sync,跟 BT 下载一样,都是 BitTorrent 公司发明滴玩意儿,都是采用 P2P 协议来进行传输. 简而言之,BT ...

  10. ubuntu下安装opencv 2.4.9 脚本,支持摄像头和cuda

    arch=$(uname -m) if [ "$arch" == "i686" -o "$arch" == "i386" ...