zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    Leetcode 811. Subdomain Visit Count
    Leetcode 70. Climbing Stairs
    Leetcode 509. Fibonacci Number
    Leetcode 771. Jewels and Stones
    Leetcode 217. Contains Duplicate
    MYSQL安装第三步报错
    .net 开发WEB程序
    JDK版本问题
    打开ECLIPSE 报failed to load the jni shared library
    ANSI_NULLS SQL语句
  • 原文地址:https://www.cnblogs.com/qifeng1024/p/12697068.html
Copyright © 2011-2022 走看看