闭包\n引用外部变量的函数称为闭包,即使离开了引用环境也不会被释放或删除。在闭包中仍然可以继续使用这个变量。\n\n函数+引用环境=闭包\n\n同一个函数,但在不同的引用环境下可以组成不同的闭包。说实话单凭这么几句话很难说清楚,先来看看例子。使用例如下\n\npackage main\n \nimport \"fmt\"\n \nfunc add() func(int) int {\n\tx := 10\n\treturn func(y int) int {\n\t\tx += y\n\t\treturn x\n\t}\n}\nfunc tmp(num int) {\n\tx := add()(num)\n\tfmt.Printf(\"%v\\n\", x)\n}\nfunc main() {\n\tf := add()\n\tfmt.Printf(\"%v\\n\", f(10))\n\tfmt.Printf(\"%v\\n\", f(-9))\n\ttmp(10)\n}\n 运行结果为\n\n20\n11\n20\n\n重点是要把握住每个函数及其变量的生命周期。\n\n在上面这段代码中,我们先来看看这个返回值为func(int) int(相当于一个数据类型为“函数”的变量)的add()函数。可以看到在add()函数中,最后返回的是另一个函数的返回值。同时我们定义了一个值为10的变量x, 并在返回值处定义了一个匿名函数作为参数。\n\n此时,add()函数就形成了一个闭包,它内部有一个变量x和一个引用了变量x的匿名函数。变量x对于这个匿名函数来说便属于外部变量。所以在add()的生命周期内,变量x会一直有效。\n\n于是我们先向add中传入10,在经过匿名函数的处理后,x的值已经变成了20。\n\n再看看主函数,我们将add()的返回值赋给了f然后打印输出。但需要注意的是,add()函数并没有在执行完第一条函数时就释放它的变量x。\n\nfmt.Printf(\"%v\\n\", f(10))\nfmt.Printf(\"%v\\n\", f(-9))\n还记得add()函数的返回值是什么类型吗?如果你去查看此时f的类型你就会发现它的返回值是func(int) int类型。相当于f也是一个函数,这相当于用f去调用add()里的匿名函数。\n\n这导致add()里的变量的生命周期和f的生命周期是一样的--一直到main函数结束。\n\nfmt.Printf(\"%T\\n\", f)\n \n//运行结果为\n//func(int) int\n但对于tmp()函数来说就不一样了,tmp调用add()中匿名函数的生命周期只到tmp函数本身结束。所以其结果与f无关。\n\n还是不理解?还是这段代码,但我们修改下tmp和f出现的位置。\n\npackage main\n \nimport \"fmt\"\n \nfunc add() func(int) int {\n\tx := 10\n\treturn func(y int) int {\n\t\tx += y\n\t\treturn x\n\t}\n}\nfunc tmp(num int) {\n\tx := add()(num)\n\tfmt.Printf(\"%v\\n\", x)\n}\nfunc main() {\n\tf := add()\n\tfmt.Printf(\"%v\\n\", f(10))\n\ttmp(10)\n\tfmt.Printf(\"%v\\n\", f(-9))\n \n}\n运行结果为\n\n20\n20\n11 \n\n 从运行结果我们可以看到tmp调用的add()中的变量x和f调用的add()中变量x无关。\n\n 那如果我们给tmp函数添加一个int类型的返回值呢?在main函数中将这个返回值赋给另一个值呢?add()中的变量x还会一直有效吗?\n\npackage main\n \nimport \"fmt\"\n \nfunc add() func(int) int {\n\tx := 10\n\treturn func(y int) int {\n\t\tx += y\n\t\treturn x\n\t}\n}\nfunc tmp(num int) int {\n\tx := add()(num)\n\treturn x\n}\nfunc main() {\n\tc tf(\"%v\\n\", c)\n\tc = tmp(9)\n\tfmt.Printf(\"%v\\n\", c)\n}\n运行结果为\n\n20\n19\n\n答案是不会,x的生命周期还是到tmp函数结束而结束。除非你把返回值改为函数类型的变量,让add()内部的匿名函数的生命周期随着main函数中的变量c,一直持续到main函数执行完而结束。

【无标题】C语言闭包学习编程相关推荐

  1. 【无标题】C++课程学习笔记(南科大于仕琪老师)

    这几天我突然想写CSDN了,前段时间我打开了我的CSDN,发现我其实只写了3篇文章,其实写CSDN是一个好习惯,我之前这么多年都没有发现这个好习惯,现在我要求自己只有有所心得就应该写下来,一方面与大家 ...

  2. 编程入门python java和c语言_学习编程适不适合从Python入门?哪种语言更适合入门?...

    本文对比了C语言和Python语言,分析它们作为编程入门语言各自的利弊,并给出了我推荐的编程学习道路. 我本身已经入门了Python脚本语言,在进阶C语言和JAVA语言后,Python重学就轻松很多, ...

  3. c语言编程切片stl1005无标题,C语言实现简单的单向链表(创建、插入、删除)及等效STL实现代码...

    实现个算法,懒得手写链表,于是用C++的forward_list,没有next()方法感觉很不好使,比如一个对单向链表的最简单功能要求: input: 1 2 5 3 4 output: 1-> ...

  4. sleep函数c语言1002无标题,C语言的sleep函数

    C语言的sleep函数 來源:互聯網  2010-01-21 08:25:31  評論 分類: 電腦/網絡 >> 程序設計 >> 其他編程語言 問題描述: 为何我在VS2005 ...

  5. python数据标准化1002无标题,Scikit标准化互信息学习给我错误的值

    我是Python新手,我试图看到两个不同信号之间的标准化互信息,不管我使用什么信号,我得到的结果总是1,我认为这是不可能的,因为信号是不同的,不是完全相关的. 我使用的是Normalized Mutu ...

  6. C语言在学习编程的作用并简单了解一下C语言

  7. 数据交互什么意思_学习编程怎么样才可以不枯燥?什么是前端语言?

    编程语言有很多种,像C, JAVA, PYTHON, 都是不错的入门语言.这些语言一般是用来写软件程序的, 像PC上的计算器,EXCEL表格,PPT软件, 数据软件,或 围棋,扫雷, 斗地主类的小游戏 ...

  8. python语言通俗理解_慢步学习,python语言编程,来扯扯语言的学习理解

    最近慢步工作比较忙,有那么一丢丢挫伤了学习的积极性.积极性受挫的另一个原因是,慢步对自己给读者提供的内容有些困惑,"我能提供什么有价值的内容?" 不断重复书籍的知识点,好像并不能生 ...

  9. Computer:少儿编程—每个人都应该学习编程,它能教你如何思考—编程入门的简介(编程语言的特点种类开发工具对比人类语言)、编程应用、编程意义之详细攻略

    Computer:少儿编程-每个人都应该学习编程,它能教你如何思考-编程入门的简介(编程语言的特点&种类&开发工具&对比人类语言).编程应用.编程意义之详细攻略 导读:乔布斯说 ...

最新文章

  1. Processing 状态量控制动画技巧
  2. Android 动态修改参数配置
  3. java内部类的使用
  4. 程序员的职业病(职业素养)之一:动手写业务代码之前先考虑异常处理
  5. java上传永久图文素材_Java-微信开发上传永久素材(支持所有文件类型)
  6. 20151118小问题
  7. 计算机专业能用ipad吗,iPad 能不能代替电脑?说说我这 3 个月的使用体验
  8. 联合、枚举和类型别名 - C++快速入门13
  9. 网格系统常用的三种比例
  10. 机器学习、数据挖掘、计算机视觉等领域经典书籍推荐
  11. java 改文件名的例子
  12. Python(42)_文件操作
  13. 最全的Vista破解激活工具——成功激活并通过正版验证
  14. 唯一标识 微信小程序_微信小程序中用户唯一ID的获取
  15. 打印DPI如何与计算机DPI一致,ps打印尺寸怎么设置和实际纸张一致? -电脑资料
  16. Discuz!论坛系统模板目录结构注释说明(以default模板为例)
  17. 计算机c盘用户爆满,Win7系统C盘突然快满了怎么办?C盘空闲空间爆满
  18. raw格式怎么打开转换成jpg?迅捷图片转换器3步搞定
  19. 红孩儿编辑器的详细设计
  20. 学校校车运营各项安全管理制度_学校校车安全管理的规章制度

热门文章

  1. 《Java编程思想》读书笔记——构造器初始化顺序
  2. Harry Potter Robber
  3. 洛谷P1827 美国血统
  4. 全新的简书网站即将上线,你都有哪些期待?
  5. 数据率失真理论(RATE DISTORTION THEORY)
  6. 可以u盘上运行linux系统,U盘上运行的linux系统--babylinux
  7. 矩阵连乘求最小连乘次数(动态规划)
  8. 选一些200页左右的书,每周看一本
  9. LINUX ECHO 颜色
  10. ubuntu没有指纹登录_在Ubuntu 使用内置指纹识别器