1. 程式人生 > >C 返回函數與閉包的考慮

C 返回函數與閉包的考慮

clas 閉包 次循環 printf col n) 可變 返回 函數

#include <stdio.h>

typedef int (*fun)();

fun closure(int i)
{
    int squ()
    {
        return i*i;
    }
    return squ;
}

int main()
{

    fun f = closure(2);

    printf("closure %d\n", f());

    return 0;
}

C中函數的嵌套定義可以實現類似閉包的效果,只是如果函數是定義在一個循環中時,如:

    for (; i>arg-2; i--)
    {
        
int squ() { return i*i; } arr[arg-i]=squ; }

在最後使用arr函數數組時始終是指向最後定義的一個squ函數。查看2次循環時,發現squ始終指向同一個地址,所以此處認為C在處理時會將前面定義的squ函數覆蓋。

這個現象和Python中的返回函數中,引用了可變化變量的現象不同,Python中在循環中定義的函數是指向不同的地址的。

C 返回函數與閉包的考慮