lambda表达式

Posted qifeng1024

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了lambda表达式相关的知识,希望对你有一定的参考价值。

首先看一下lambda表达式的格式

[外部变量访问方式说明符] (参数表) -> 返回值类型
{
   语句块
}

 

其实lambda表达式就是一个简单的函数

格式里面的参数,返回值,语句块 都是普通函数的参数 返回值和函数体

前面的访问方式说明符有两种 [&] [=]

[=]  表示变量不可被修改

[&]  和[=]相反,表示变量可以被修改

 

举个栗子

int main(int argc,char *argv[])
{
    auto fun = [=](int a)->int { return a; };
    cout << fun(6) << endl;
    return 0;
}

输出自然是6,这个表达式就相当于这样一个函数 输出一个int 然后return这个int

如果我将这个例子稍加改动,在return 之前先改一下a,那就要用[&]

int main(int argc,char *argv[])
{
    auto fun = [&](int &a)->int { a++; return a; };
    int a = 6;
    cout << fun(a) << endl;
    return 0;
}

当然了也可以不写返回值,这样编译器会自动识别你的返回值,如果没有返回值就返回void

int main(int argc,char *argv[])
{
    auto fun = [&](int &a){ a++; return a; };
    int a = 6;
    cout << fun(a) << endl;
    return 0;
}

[=, &x, &y]  表示外部变量 x、y 的值可以被修改,其余外部变量不能被修改;
[&, x, y]      表示除 x、y 以外的外部变量,值都可以被修改。

 

甚至我还可以没有参数列表

int main(int argc,char *argv[])
{
    auto fun = [&](){ cout << "a" <<endl; };
    fun();
    return 0;
}

 

看下面这个例子

int b = 8;

int main(int argc,char *argv[])
{
    static int a = 6;
    auto fun = [&](){ a++; return a+b; };
    cout <<fun()<<endl;
    return 0;
}

输出值为15

我没有传入参数,但是他能使用我前面定义过的全局变量和静态变量。

 

 

int b = 8;

int main(int argc,char *argv[])
{
    static int a = 6;
    int c = 8;
    auto fun = [=](){ a++; return c = a+b+c; };
    cout <<fun()<<endl;
    return 0;
}

这个代码就是错误的,因为在函数体里面改变了c的值,但是访问说明符是[=]

所以要改成

int b = 8;

int main(int argc,char *argv[])
{
    static int a = 6;
    int c = 8;
    auto fun = [&](){ a++; return c = a+b+c; };
    cout <<fun()<<endl;
    return 0;
}

这样才能得出正确结果23

 

以上是关于lambda表达式的主要内容,如果未能解决你的问题,请参考以下文章

JAVA由一个将JSONArray转成Map的需求引发的lambda语法的学习

函数式编程

C# fun

Lambda表达式

Lambda表达式

Lambda表达式常用代码示例