首先給出結論,是。為什麼?

我們不妨先來從面向對象切入。

當我們將面向對象看作是語言的屬性時,c語言是面向對象語言嗎?眾所周知,c++,java等高級語言都是面向對象語言,而通常我們說c語言是面向過程的。這是因為c++與java對面向對象提供了很好的優化,通過類,成員變數與方法,繼承與多態,虛函數與重載等特性,我們就可以很詳細的抽象對象的模型。但是c語言中只有結構體,結構體內部不能定義函數,只能有成員變數,於是我們在用c語言抽象對象模型時遇到了很多困難,所以通常我們說c語言是面向過程的。

但是面向對象的提出是為了編程思想更好的演進,而不是作為劃分語言屬性。換句話講,面向對象的編程思想是與語言無關的。使用c語言的結構體,結合函數指針,我們也可以在c語言中實現c++中類的各項功能,只不過我們做了很多在其他高級語言中編譯器要做的事情,這對開發者而言很不友好,而且維護成本很高。

這裡我要說的是,如果你問我c語言是面向對象語言嗎?我一樣會回答是。因為面向對象是思想,不是劃分語言的屬性。

最後,我們回到問題上,函數式意味著我們可以將代碼打包封裝,預留出介面,一個函數可以從介面調用其它函數的返回值,並將自身的返回值作為介面供其他函數調用。這同樣是一種設計思想,通過這樣的方式,我們很容易的可以將工程模塊化,實現模塊間的解耦。

無論是語言本身對於函數式編程的支持與優化上還是從編程思想的實現上,c語言顯然都是符合這一特點的。


首先,我們先看一下百度百科上是如何定義函數式編程的:

函數式編程是種編程範式,它將電腦運算視為函數的計算。函數編程語言最重要的基礎是 λ 演算(lambda calculus)。而且λ演算的函數可以接受函數當作輸入(參數)和輸出(返回值)。和指令式編程相比,函數式編程強調函數的計算比指令的執行重要。和過程化編程相比,函數式編程里,函數的計算可隨時調用。

從上文中我們可以看出,所謂的函數式編程,和面向過程編程、面向對象編程一樣,是一種編程的方法、編程的思想。

所以問題的描述並不準確,確切的說,C 語言可以使用函數式編程的方法進行編程。


C是你說的面向對象或者面向函數的高等語言的實現語言。你可以用C進行任何範式的代碼類型開發。唯一的區別是,那些語言已經幫你制定了規範,而C語言需要你自己制定規範,比如制定一個定義特定類型函數指針的宏,然後所有具有callback特性的參數都必須用這個宏定義。C還能做的更多,可以實現各種範式的混合開發。當然,學習C語言需要10年以上才能靈活使用它。但高等面向函數式語言只要一周就可以學習完畢,一個月就能實戰了。


推薦閱讀:
相关文章