Linux C 最正確的取最大最小值巨集

2021-10-02 17:14:13 字數 1124 閱讀 3079

這裡以兩個值中取最小值為例:

#define min_t(type, x, y) \

()

gnu c把包含在括號中的復合語句看成是乙個表示式, 稱為語句表示式, 它可以出現在任何允許表示式的地方. 我們可以在語句表示式中使用原本只能在復合語句中使用的迴圈、區域性變數等, 例如:

#define min_t(type, x, y) \

()int ia, ib, mini;

float fa, fb, minf;

mini =

min_t

(int

, ia, ib)

;minf =

min_t

(float

, fa, fb)

;

因為重新定義了__x和__y這兩個區域性變數, 所以用上述方式定義的巨集將不會有***. 在標準c中, 對應的如下巨集則會產生***:

#define min(x, y) ((x)<(y) ? (x) : (y))
在很長一段時間內我都覺得這是最正確的, 畢竟它加上了括號, 排除了x或y是乙個表示式導致了錯誤的可能. 萬萬沒想到當x或y是x++或者y++時它的異常情況…

**min(++ia, ++ib)會展開為((++ia) < (++ib) ? (++ia) : (++ib)), 傳入的巨集的"引數"

增加了兩次!

在這裡我假設你在寫筆試題, 然後筆試題又限制巨集只能使用兩個引數或者說x,y不是同乙個型別的:

此時我們可以巧用typeof關鍵字:

#define min(x, y) ()
我們不需要像min_t(type, x, y)那個巨集那樣把type傳入, 因為通過typeof(x)、typeof(y)可以獲得type.

**行(void)(&__x == &__y)的作用是檢查__x和__y的型別是否一致.指標(位址)的比較也需要相同型別, 不同的話編譯器會警告!

以上內容大部分摘抄自《linux裝置驅動開發詳解 基於最新的linux4.0核心》宋寶華

第三章 linux核心及核心程式設計

swustoj 327 最小的最大與最大的最小

time limit ms 2500 memory limit kb 65535 submission 329 accepted 18 問題描述 又是乙個資料處理題 還是直接看input吧。輸入一組測試例項。line 1 兩個數n,m 1 n 1000000,1 m 100000 n表示數字個數,m...

Linux C取整的方法

c語言有以下幾種取整方法 1 直接賦值給整數變數。如 int i 2.5 或 i int 2.5 這種方法採用的是捨去小數部分 2 c c 中的整數除法運算子 本身就有取整功能 int int 但是整數除法對負數的取整結果和使用的c編譯器有關。3 使用floor函式。floor x 返回的是小於或等...

陣列取最大值最小值

1 陣列取出最大值,最小值的方式 第一種 遍歷一邊陣列就可以找出需要的值,基本上可以說是速度最快的演算法,還不需要排序 int intarray int max intarray 0 int min intarray 0 for int i intarray listl arrays.aslist ...