基礎課一:函數調用算符()
我在前文中提到下面這行難住10歲開始編程的牛博士的代碼
local = (char *(*)()) inc_1;
很多人號稱學過C,但是看了這行代碼看不懂之後,說這是垃圾。其實這是一句必要的code,程序員在寫的時候並沒有在故弄玄虛,而是寫了最簡短的代碼。這是一個很早以前的程序中的一行代碼,並非編造。而且是一行簡單的代碼--如果你能懂C。
按理說,一個人學過C/C++, 要有點創造力,可以幾乎零成本創業,一台PC,加上大腦就應該可以開發產品了---Linus一個人完成了Linux主要核心部分,Thompson和Ritchie一萬多行C搞定UNIX 。
問題在於,很多人學了C,並不懂C語言,他們只會文科C:就是模仿一些pattern,依樣畫葫蘆,真要變通一下,就搞不清了。要成為高等電民,得學會理工思維,搞清原理,否則跟勞工差不多,只會copy&paste。
看上面這段代碼右邊,最外面是一層括弧後跟一個inc_1,所以這是一個cast 語句,也就是括號裡面必須是一個type。什麼type呢?一看裡面的()的算符就知道了,()叫函數調用算符(當然這裡的作用不是調用函數,而是聲明類型), call operator。所以裡面是一個pointer to function,而這個function的return type是 char*。
當然,程序員如果稍微勤快點,他可能會這麼寫
typedef char* (*ptr_func)();
local = (ptr_func) inc_1;
基礎課二:下標算符 [ ]
C++基本是C的一個superset,因此C里的表達在C++絕大部分是合法的。
E1 [E2] 類型的expression 為postfix-expression的一種。
其中E1為postfix-expression, E2為expression.
E1[E2]的語義是 *(E1+E2).
所以我們只要求 E1+E2 產生一個指針。根據+運算的屬性,只要E1或者E2中的任一個是指針即可。換言之,E1[E2]與E2[E1]可能是完全等價的(排除[]被重載的情況)。
|