assert巨集的實現 一道筆試題)

2021-06-18 14:43:22 字數 1252 閱讀 9300

assert巨集的實現(一道筆試題)

assert巨集其實很重要,對於除錯程式來說。

如果你說你精通c/c++,然後面試官讓你寫個assert巨集的實現,你卻寫不出來,甚至都不曾經用過,那面試官

對你的評價一下就降低了很多。

assert其實很簡單,它就是為了確定乙個條件為真,如果不為真,則給出出錯資訊,並且中止程式。

所以assert也叫斷言。

例如如下程式:

#include

#include

int main()

如果需要用到assert需要包括標頭檔案assert.h.

這裡assert(i!=100);就是確保i不等於100,程式才可以繼續執行,否則程式中止,給出出錯資訊。

所以執行上面的程式的結果:

可以看出,assertion failed.也就是斷言失敗, i!=100,是你的斷言,它失敗了,所以這裡說明i==100,

後面就是assert()這個巨集失敗所在的檔案和行數。

下面我們把assert.h這個標頭檔案去掉,自己寫個assert()巨集的實現,加深理解斷言巨集。

#include

#define assert(exp) (void)((exp)||(_assert(#exp,__file__,__line__),0))

void _assert(void * exp, void * file, unsigned int line)

int main()

程式如上,你執行會發現和上面使用assert.h標頭檔案的程式的執行結果格式一樣,說明實現了assert()巨集。

執行結果:

這裡的實現主要注意以下幾點:

1,(void)((exp)||(_assert(#exp,__file__,__line__),0))

這裡利用了||的短路性質,就是條件為真,它就不執行後面的了,為假才執行。

#exp會在預處理產生乙個字串,也就是上面的i!=100.

__file__,__line__,分別表示檔案位置和行數。

2,abort();

這個函式是乙個內部函式,它就是異常中止你執行的程式。中的紅叉debug error!的出現,就是因為調

用了這個程式,把它去掉,就不會出現了。

一道筆試題

看到一道筆試題,跟自己想的有點出入,就跑了下,看了看原因。我稍微改了下 include int main int argc,char argv 輸出結果 c 5 d 245 press any key to continue vc6.0 debug下的彙編 5 unsigned char a 0xa...

一道筆試題

上次去筆試的時候,有一道題,怎麼也沒做出來,當時也是很緊張,有些思路,但卻沒有做出來。有四個人要過乙個獨木橋,因為天比較黑,而且橋只能允許兩個人同時通過,並且他們只有乙個手電筒。四個人單獨同時橋的時間是1,2,5,8分鐘。問最短的時間是多少?當時我的答案 1和8,1回來,1 5,1回來,1 2 8 ...

一道筆試題

題目是這樣的 判斷乙個小於1000的正整數是否為素數。素數的定義就不說了,以下直接分析解法,畢竟是在寫與專業相關的東西,是給本專業的人看得,所以看的人應該有點基礎吧?求素數的問題是乙個數學上的難題,這是常識,但是本題目限制了最大範圍是在1000以內,所以就可以嘗試找出乙個足夠好的解了。首先給出乙個最...