C 返回函數與閉包的考慮
阿新 • • 發佈:2017-07-03
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 返回函數與閉包的考慮