標籤:

C++ 為什麼沒有 function 關鍵字?


因為當初妄圖做到這樣:不通過function關鍵字就確定是不是函數。

然而當初的C語言比較簡單,的確可以做到。現在的C++依然需要兼容C的語法,但是引入了很多新語法之後,這個設計造成了很多坑,經常會混淆函數定義與轉型表達式、函數調用等等。


Python

def functionA():

我:編譯器,我告訴你,這個functionA是一個函數,懂了嗎?

編譯器:懂,了解。

--------------------------------------------------------------------------------------------

C

Type functionA(void);

我:編譯器,我不說,你知道它是什麼吧?

編譯器:返回類型、函數名、圓括弧、傳入參數,啊~~~函數聲明啊,懂懂懂。

--------------------------------------------------------------------------------------------

C++

Type functionA();

我:編譯器,我不說,你知道它是什麼吧?

編譯器:喵喵喵?

我:這是一個函數聲明,懂不懂?

編譯器A:你的Type是一個類,你這句「話」放在主函數里是什麼意思?是函數聲明還是調用構造函數?

編譯器B:????????????老子看不懂,你這寫的是什麼?垃圾程序員。


C++不需要function關鍵字就能確定一個東西是不是函數


關鍵是為什麼需要一個function關鍵字?


因為不需要


因為不需要。

那為什麼不作為提示用呢?

因為 C++ 師承 C 。

在 C 誕生那個年代鍵盤不發達,程序員為了少打幾個字元喪心病狂,以致 C 有「一行聲明能聲明不同類型的對象/函數」這種奇葩設定。而且 C 誕生之初就有函數(直接從 B 繼承的)。

如果說一部分像是數學的函數的東西(無副效應、同樣輸入得到同樣輸出)的話,可以將一部分 constexpr 看成 function ,不過對應得並不好。(且 cmath 裡頭的函數都不是 constexpr ,簡直……)

如果說像是 Pascal 的 function 的東西的話,auto 可以提供有點像的語法:

constexpr auto is_prime(std::int64_t n) -&> bool

vs

function IsPrime(n : Int64) : Boolean;

(僅作說明, Pascal 的常表達式無法擴展到自定義函數,只能是運算符和某些內建函數的組合)

大概就這些有點像…


沒必要有function關鍵字吧,C++里可以看出來什麼是函數,什麼是變數初始化,前提是能分得清int a和int a()的區別。(曾經掉進坑裡過,後來明明白白我的心)


一切為了令人討厭的c兼容性。

講道理c++如果有function關鍵字絕對會對編譯器前端後端都有莫大的好處。

但是一切為了令人討厭的兼容


你可以把聲明函數的auto當作function。


完全不需要啊


c 又不是函數式編程語言


一定需要function關鍵字的話出門左轉JavaScript


歷史原因吧,實際上 void function()自己定義一個函數學習std::function這樣自己實現就行了,畢竟萬能工具箱,可以玩轉很多黑魔法


因為當初c設計時就是要用盡量少的關鍵字(實際上c只有32個關鍵字),因為c初衷就是代替大部分彙編的,x86彙編關鍵字加上參數上千個。再說,在c c++里根本不用function就知道是函數,因為有()!


推薦閱讀:

如何用通俗易懂的語言解釋虛擬存儲器?
計算機語言算不算語言?
國人對於國外CS教材是否存在盲目崇拜心理?
Node.js是用來做什麼的?
前端的表單驗證還有必要嗎?

TAG:計算機科學 | C |