新网站做优化要准备什么,房地产销售策划方案,网页设计导航栏设计,中国建筑集团领导名单这几天在看 C 的 lambda 表达式#xff0c;挺有意思#xff0c;这个标准是在 C11标准 加进去的#xff0c;也就是 2011 年#xff0c;相比 C# 2007 还晚了个 4 年#xff0c; Lambda 这东西非常好用#xff0c;会上瘾#xff0c;今天我们简单聊一聊。一#xff1a;语法… 这几天在看 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 函数在现实开发中往往不仅要获取参数还要获取 外部作用域 的变量比如说我想计算 abc 的结果接下来稍微改一下代码可以看到居然给报错了在 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 程序员有能力用好。好了本篇就聊这么多希望对你有帮助。