A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© ZXY66452 中级黑马   /  2015-12-5 21:53  /  617 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

Blocks比C++0x中的lambda表达式更强的一点是,它可以是个数组类型:
int main(void)
{
    void (^p[2])(void) = { ^(void){ puts("Hello, world!"); }, ^(void){ puts("Goodbye!"); } };
    p[0](), p[1]();
}
这里p的类型为void(^[2])(void),表示含有2个void(^)(void)块引用元素的变量。下面谈谈函数块对其外部临时变量的可访问情况。
static int global = 100;
int main(void)
{
    int local = 200;
    void (^p)(void) = ^(void){ printf("The answer is: %dn", global + local); };
    p();
}
对于FP比较熟悉的朋友可能会想到,如果一个外部变量能够随随便便被一个函数块修改的话,那么对于其本身的副作用仍然无法进行方便地多核并行编程。那么我们不妨试试看吧:
static int global = 100;
int main(void)
{
    int local = 200;
    void (^p)(void) = ^(void){
        printf("The answer is: %dn", global + local);
        global++;
        local--;    // compiling error:error: decrement of read-only variable \'local\'
    };
    p();
printf("After modified, global is: %d and local is %dn", global, local);
}
对于全局变量可以进行修改,但是对于main函数中的局部变量则不行。如果对local修改则无法通过编译。很显然,Blocks对此已经有了相应的机制。 那么我们如何能够对local进行修改呢?
static int global = 100;
int main(void)
{
    __block int local = 200;
    static int s = 10;
   
    void (^p)(void) = ^(void){
        printf("The answer is: %dn", global + local);
        global++;
        s++;
        local--;
    };
    p();
    printf("After modified, global is: %d and local is %d and s is: %dn", global, local, s);
}
这里引入了一个新的关键字 ——__block,用此声明一个局部变量可以被函数块修改。

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马