寫乙個「標準」巨集min,這個巨集輸入兩個引數並返回較小的乙個。另外,當你寫下面的**時會發生什麼事?
least = min(*p++, b);
解答:
#define min(a,b) ((a) <= (b) ? (a) : (b))
min(
*p++
, b)會產生巨集的***
剖析:
這個面試題主要考查面試者對巨集定義的使用,巨集定義可以實現類似於函式的功能,
但是它終歸不是函式,而巨集定義中括弧中的「引數」也不是真的引數,在巨集展開的時
候對「引數」進行的是一對一的替換。
程式設計師對巨集定義的使用要非常小心,特別要注意兩個問題:
(1)謹慎地將巨集定義中的「引數」和整個巨集用用括弧括起來。所以,嚴格地講,
下述解答:
#define min(a,b) (a) <= (b) ? (a) : (b)
#define min(a,b) (a <= b ? a : b )
都應判0分;
(2)防止巨集的***。
巨集定義#define min
(a,b)
((a)
<=
(b)?
(a):
(b))對min
(*p++
, b)的作用結果是: ((
*p++
)<=
(b)?
(*p++):
(b))
這個表示式會產生***,指標p會作2次++自增操作。
除此之外,另乙個應該判0分的解答是:
#define min(a,b) ((a) <= (b) ? (a) : (b));
這個解答在巨集定義的後面加「;」,顯示編寫者對巨集的概念模糊不清,只能被無情地判0分
並被面試官淘汰。
巨集的作用是替換 (a) <= (b) ? (a) : (b)會發生歧義。為了避免發生錯誤外加括號
#define min(a,b) (a) <= (b) ? (a) : (b)
3**min(a,b)
巨集展開後為
3*(a)<=(b)?(a):(b)
這裡務必要說明一下:如果*p的值大於b,那麼只會做一次自增操作,反之才會做兩次自增!!!
牛客網C 刷題
今天刷了些c 的題,就其中物件導向分享一下我的感悟。首先區分一下物件導向和面向過程 物件導向是首先抽象出各種物件 各種類 把資料和方法都封裝在物件中 類 然後各個物件之間發生相互作用。面向過程是將問題分解成若干步驟 動作 每個步驟 動作 用乙個函式來實現,在使用的時候,將資料傳遞給這些函式。stl有...
牛客網刷題
時間限制 c c 1秒,其他語言2秒 空間限制 c c 262144k,其他語言524288k 64bit io format lld 立華奏在學習初中數學的時候遇到了這樣一道大水題 設箱子內有 n 個球,其中給 m 個球打上標記,設一次摸球摸到每乙個球的概率均等,求一次摸球摸到打標記的球的概率 e...
牛客網刷題
時間限制 c c 2秒,其他語言4秒 空間限制 c c 524288k,其他語言1048576k 64bit io format lld 立華奏是乙個剛剛開始學習 oi 的萌新。最近,實力強大的 qingyu 當選了 iods 9102 的出題人。眾所周知,iods 是一場極其毒瘤的比賽。為了在這次...