歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> Lambda表達式(C語言)

Lambda表達式(C語言)

日期:2017/3/1 9:13:50   编辑:Linux編程

前言

先來啰嗦幾句,身邊的朋友,同事都喜歡在文章上記錄自己在學習計算機編程技術路程上的一些問題和心得。就我個人而言,這是個好習慣,特別是在計算機編程領域,技術方向種類繁多,永無止境。所以,我也開始我人生中第一份文章,希望看到的朋友多多鼓勵和討論,在此謝過。對於計算技術,越是深入越越數學掛鉤,想達到大神級別,嗯,我是有自知之明的。計算機技術雖然之多,並不需要我們每一個領域每一項技術都特別的精通。當然,能做到,我由衷的佩服和羨慕,只要我們專注於某些技術領域並能達到“精通”兩個字就已經很不容易,畢竟精神和身體耗損太大,一般人難以達到包羅萬象。個人特別喜歡C語言,用其研發已有6年多的時間,一直很熱衷,時不時的學習其它語言,使用C語言來模仿它們有意思的技術。下面就由讀者和我一起來看看使用C語言實現Lambda表達式。

什麼是Lambda表達式

“Lambda 表達式”(Lambda Expression)是一個匿名函數,Lambda表達式基於數學中的λ演算得名,直接對應於其中的lambda抽象(lambda abstraction),是一個匿名函數,即沒有函數名的函數。Lambda表達式可以表示閉包(注意和數學傳統意義上的不同)。

C-Lambda表達式

C語言實現Lambda表達式,一般來說都是通過宏定義來的,這樣就可以使用類似Lambda(...)這樣形式,請看下面:

#define cgs_lambda( return_type, function_body) \

({return_type cgs_lambda_func function_body cgs_lambda_func;})

上述,就是Lambda表達式的宏定義,“cgs_”前綴是我在自己的項目中使用的,不是重點。重點在於( return_type, function_body)使用在({return_type cgs_lambda_func function_body cgs_lambda_func;})語句,return_type為返回類型,function_body為Lambda表達式中匿名函數的函數體。注意,中間cgs_lambda_func其實就是匿名的函數名,最後的cgs_lambda_func的作用表示函數的地址就定義在此,如何使用cgs_lambda表達式,我們通過一個簡單的實例做進一步分析。

使用C-Lambda表達式

完整代碼如下:

#include <stdio.h>

/** 這裡是我們定義的Lambda表達式的宏定義 */

#define cgs_lambda( return_type, function_body) \

({return_type cgs_lambda_func function_body cgs_lambda_func;})

/*************************** 測試Main **************************/

int main( int argc, const char **argv)

{

  /** 我們做兩個數相加的操作 */

printf( "Sum = %d\n", cgs_lambda( int, (int x, int y){ return x + y; })(3, 4) );

  return 0;

}

可以通過編譯和運行試試,運行結果為:Sum = 7

好了,我們來講解一下,return_type為int型,function_body為帶兩個入參的函數體(int x, int y){ return x + y; },後面的(3, 4)就是我們調用cgs_lambda_func傳的入參。這樣應該知道cgs_lambda表達式中最有一個“cgs_lambda_func;”的作用了,別忘了末尾的分號“;",否則編譯不過去的。

我們來翻譯上述我們示例中的cgs_lambda表達式編譯過後是什麼樣子,如下:

({int cgs_lambda_func (int x, int y){ return x + y; } cgs_lambda_func;})(3, 4)

簡單剖析,“函數聲明--->立即傳參調用”,代碼塊由“({”和“})”括住,其實作用域也就是僅限於“({”和“})”之間,達到局部的作用。引入訪問外部變量的例子:

#include <stdio.h>

/** 這裡是我們定義的Lambda表達式的宏定義 */

#define cgs_lambda( return_type, function_body) \

({return_type cgs_lambda_func function_body cgs_lambda_func;})

/*************************** 測試Main **************************/

int main( int argc, const char **argv)

{

int a = 1;

  /** 我們做兩個數相加的操作 */

printf( "Sum = %d\n", cgs_lambda( int, (int x, int y){ a++; return x + y; })(a, 4) );

printf( "a = %d\n", a);

  return 0;

}

結束語

非常感謝讀者的耐心細讀,我會慢慢更新我的文章,也會做好我的文章,最近自己在忙於寫網絡服務器方面的小型框架,謝謝您的關注,祝您身體健康,萬事如意。

Copyright © Linux教程網 All Rights Reserved