聊聊 C++ 和 C# 中的 lambda 玩法
这几天在看 C++ 的 lambda 表达式,挺有意思,这个标准是在 C11标准
加进去的,也就是 2011 年,相比 C# 2007 还晚了个 4 年, Lambda 这东西非常好用,会上瘾,今天我们简单聊一聊。
一:语法定义
首先我们看下 C++ 语法定义格式:
[capture] (parameters) mutable ->return-type{statement}
相比 C# lambda 的语法格式:
(parameters) => {return-type statement}
要复杂一些,之所以复杂还是因为 C++ 让程序员用的必须更谨慎一些。
二:谨慎在哪里?
为了说明更谨慎在哪里,我们上一个简单的例子。
int main() {
int a = 1;
int b = 2;
auto func = [](int c) -> void {
cout << "input:" << c << endl;
};
func(10);
return 0;
}
上面就定义了一个原子化的 lambda 函数,在现实开发中往往不仅要获取参数,还要获取 外部作用域
的变量,比如说,我想计算 a+b+c
的结果,接下来稍微改一下代码:
可以看到,居然给报错了,在 C# 中可是一点问题都没有。
1. 谨慎1 :屏蔽外部所有作用域变量
C++ 默认屏蔽所有的外部作用域值,这么做大概率还是想让程序员知道自己的意图,这相比 C# 要严谨的多,算是喜忧参半吧。
那如何让 C++ 代码通过呢? 这就需要用到语法格式中的 [capture]
部分,简而言之就是需要告诉编译器打开栅栏放哪些变量进来,比如 =,&
,两者都可以访问所有的外部作用域变量,不同的是前者是 按传值方式,后者 按引用方式 。
- 按值方式
有了思路后,修改代码如下:
int main() {
int a = 1;
int b = 2;
auto func = [=](int c) -> void {
auto sum = a + b + c;
cout << "sum:" << sum << endl;
};
func(10);
return 0;
}
哈哈,这个问题我们完美搞定。
- 按引用方式
大家都知道,按引用
传的是地址,言外之意就是可以做到 原地修改
,接下来我们修改下代码。
int main() {
int a = 1;
auto func1 = [&]() -> void {
a = 10;
};
func1();
cout << "a =" << a << endl;
return 0;
}
谨慎2:屏蔽所有按值传递的修改
为了方便说明,我们先看图:
可以看到,按值传递进来的值都是无法修改的,这么做主要还是怕程序员弄混了,如果一定要让代码通过,就需要增加语法格式中的 mutable
项,本质上就是踢掉默认的 const
,这样在方法体中就可以修改 a
变量,修改代码如下:
int main() {
int a = 1;
auto func1 = [=]() mutable -> void {
a = 10;
};
func1();
cout << "a =" << a << endl;
return 0;
}
哈哈,成功修改,当然语句够简单的话,还可以将下面的代码:
auto func1 = [&]() -> void {
a = 10;
};
修改成如下:
auto func1 = [&]() {
a = 10;
};
关于作用域方面还有很多好玩的,比如只放某一个变量进来。
总体上来说,C++ 的 lambda 的格式相比 C# 更严谨,反过来说就是不太相信 C++ 程序员有能力用好。,好了,本篇就聊这么多,希望对你有帮助。
聊聊 C++ 和 C# 中的 lambda 玩法的更多相关文章
- C#语法糖系列 —— 第二篇:聊聊 ref,in 修饰符底层玩法
自从 C# 7.3 放开 ref 之后,这玩法就太花哨了,也让 C# 这门语言变得越来越多范式,越来越重,这篇我们就来聊聊 ref,本质上来说 ref 的放开就是把 C/C++ 指针的那一套又拿回来了 ...
- javascript中的数字玩法,颠覆你的眼睛
1.JavaScript中的数字中有一些很奇葩的现象. 在Chrome控制台中可以自己做一下实验: 1 === 1.0 ; //true 习惯了强类型语言,如java,c,OC看到这个结论还是有点小迷 ...
- 性能计数器在.NET Core中的新玩法
传统的.NET Framework提供的System.Diagnostics.PerformanceCounter类型可以帮助我们收集Windows操作系统下物理机或者进程的性能指标,基于Perfor ...
- js中insertAdjacentHTML的玩法
原型:insertAdajcentHTML(swhere,stext) insertAdjacentHTML方法:在指定的地方插入html标签语句 参数:swhere: 指定插入html标签语句的地方 ...
- 聊聊 C# 和 C++ 中的 泛型模板 底层玩法
最近在看 C++ 的方法和类模板,我就在想 C# 中也是有这个概念的,不过叫法不一样,人家叫模板,我们叫泛型,哈哈,有点意思,这一篇我们来聊聊它们底层是怎么玩的? 一:C++ 中的模板玩法 毕竟 C+ ...
- C#语法糖系列 —— 第三篇:聊聊闭包的底层玩法
有朋友好奇为什么将 闭包 归于语法糖,这里简单声明下,C# 中的所有闭包最终都会归结于 类 和 方法,为什么这么说,因为 C# 的基因就已经决定了,如果大家了解 CLR 的话应该知道, C#中的类最终 ...
- [转]Pythoin中的Lambda表达式
引用自:http://www.cnblogs.com/evening/archive/2012/03/29/2423554.html 在学习python的过程中,lambda的语法时常会使人感到困惑, ...
- 【第1期】腾讯云的1001种玩法征集,Ipad mini和Kindle 等你拿!(文章评审中)
版权声明:本文由阁主的小跟班原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/695994001482226944 来源:腾云 ...
- 你知道C#中的Lambda表达式的演化过程吗
你知道C#中的Lambda表达式的演化过程吗? 阅读目录 委托的使用 匿名方法 Func和Action Lambda的诞生 那得从很久很久以前说起了,记得那个时候... 懵懂的记得从前有个叫委托的东西 ...
随机推荐
- Visual Studio 2022 git error Unable to negotiate with xx.xxx.xxxx port 22: no matching host key type found. Their offer: ssh-rsa
前言 前两天因为升级了Git导致git提交拉取的时候都提示下面这个异常,然后经过一番折腾以后终于把这个问题解决了.但是今天我升级了下Visual Studio 2022将其升级到了17.1.3版本然后 ...
- python+pytest接口自动化(13)-token关联登录
在PC端登录公司的后台管理系统或在手机上登录某个APP时,经常会发现登录成功后,返回参数中会包含token,它的值为一段较长的字符串,而后续去请求的请求头中都需要带上这个token作为参数,否则就提示 ...
- Mysql 8 使用过程中的命令记录
Mysql 8 使用过程中的命令记录 注: 当前 MySQL 数据库的版本 8.0.27 修改密码 1. 使用其他用户修改root 密码 ALTER USER 'root'@'localhost' I ...
- JAVA 进程线程详解
线程和进程 一.进程 进程是指运行中的程序,比如我们使用QQ,就启动该进程分配内存空间. 进程是程序的一次执行过程,或是正在运行的一个程序.是一个动态的过程:有它自升的产生,存在和消亡的过程 二.线程 ...
- Water 2.5.9 发布,一站式服务治理平台
Water(水孕育万物...) Water 为项目开发.服务治理,提供一站式解决方案(可以理解为微服务架构支持套件).基于 Solon 框架开发,并支持完整的 Solon Cloud 规范:已在生产环 ...
- php实验一专属跳转博文
今天完成了php关于设计个人博客主页的实验一作业. 这是php实验一作业中博客的跳转链接页.
- Codeforces Round #704 (Div. 2), problem: (C) Maximum width还是要多学习
Problem - C - Codeforces 看清题目要求, 最重要部分在第二段. 大佬最后给出的代码果然简单, 思路简单化, 未必非要把答案在一个大括号里全部完成, 两个指针同时跑,中间加了一堆 ...
- Java-GUI编程之处理位图
如果仅仅绘制一些简单的几何图形,程序的图形效果依然比较单调 . AWT 也允许在组件上绘制位图, Graphics 提供了 drawlmage() 方法用于绘制位图,该方法需要一个Image参数一一代 ...
- python黑帽子(第四章)
Scapy窃取ftp登录账号密码 sniff函数的参数 filter 过滤规则,默认是嗅探所有数据包,具体过滤规则与wireshark相同. iface 参数设置嗅探器索要嗅探的网卡,默认对所有的网卡 ...
- Navicat导出结果显示科学计数法(PostgreSQL)
原因:在EXCEL录入数超过11位,就会变成科学记数法 解决方案: 在postgresql需要导出的列中加入制表符 示例: SELECT 6280920221390000000061:: TEXT | ...