linux核心函式中的max函式編寫得非常優秀,讓我忍不住要拿出來分析一番。傳統定義max函式是#define max(x,y) ((x) > (y) ? (x) : (y))。是不是覺得這樣定義已經perfect了,那先看下面這個例子。
int x = 1, y = 2;
printf("max=%d/n", max(x++, y++));
printf("x = %d, y = %d/n", x, y);
按道理max函式執行完成後,x=2,y=3。但是實際得到的結果是x=3,y=4。預編譯後程式程式設計這樣:printf("max=%d/n", x++ > y++ ? x++ : y++); x++和y++都被執行了兩次。同時當比較兩種不同型別的資料時,編譯器應該給出警告資訊,所以很遺憾linux核心不會採用這種扛不住測試的**存在。
linux核心中max函式定義如下所示。
核心中定義的max函式可以避免出現剛剛出現的i++問題,稍微有點c**基礎的都能看明白這個**。typeof(x)代表定義乙個x型別的型別;最後一行是?和:表示式。()這個是gcc的擴充套件,()是乙個表示式,逗號表示式類似,但是功能更強,()中可以包含有多條語句(可以是變數定義、複雜的控制語句),該表示式的值為statement list中最後一條語句的值。
有人可能會想了,那第四條語句在此有什麼意義呢?讀者應該相信linux核心不會寫無用的**。該語句是用來判斷傳入兩個引數的型別,比較型別我們可以通過比較指標,指標只有滿足位址和型別這兩個引數後才能訪問,編譯比較這兩個位址時,這兩個指標的值是肯定不相等的,如果型別不相等的兩個指標做比較,那麼編譯器會發出警告資訊。這裡的巧妙之處是用這條語句判斷傳入的引數是不是同一種型別。
Linux核心中的Min和Max函式
今天看 時看到乙個有趣的東東,就是linux核心也有min函式,但它的實現很是奇怪,先貼出來 min max macros that also do strict type checking.see the unnecessary pointer comparison.define min x,y ...
部落格117 核心如何巧妙實現 min與max函式
內容 記錄一下看了linux核心的min,max函式的實現,非常的巧妙且精細,分享一下 define min x,y define max x,y define min3 x,y,z define max3 x,y,z 巧妙之處解析 1.void min1 min2 無意義的比較究竟意義何在?答 v...
Max()函式與Min()函式
在資料庫中max 求最大值,min 求最小值 用法用例 select max column name min from table name 函式括號列中的資料可以是數值,字串,或者日期型別 例項 查詢teacher表中的最大年齡 select max age from teacher 但實際中這樣...