牛客網C 刷題十二

2021-10-03 08:38:07 字數 1152 閱讀 8220

寫乙個「標準」巨集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 是一場極其毒瘤的比賽。為了在這次...