assert與if的區別 講個小故事一下就明白了

2021-08-28 03:34:09 字數 1191 閱讀 9391

記得我好像給小明說過:記住了,assert是在debug模式下才有效,它是乙個用於除錯的巨集,除非你修改系統巨集,我想吃飽了沒事幹才那樣做。

今天:我

:小明,這是release版本要上線了,下面這兩句**是你寫的?怎麼沒有if判斷呢?

int* p = (int*)malloc(sizeof(int));

assert(p);

小明:哥,是我寫得啊,assert不是也是用來判斷的嗎,好像跟if判斷沒啥差別吧。

我:我給你兩個大嘴巴子,來來來,哥給你說道下,別人寫malloc這個介面的人都知道可能會為空的,明知道可能會為空,你還用啥assert,你自己調到release模式下看看這兩句,就問你assert還有效嗎?不記得我以前給你說過的嗎,我就問你如果debug模式下沒報錯,而release版本出去後p為空你就等著挨罵災難降臨吧,還不趕快用if去處理了!!!

小明:哎呀,哥,還真是你說的那樣,,,我居然以為它們沒啥差別,,那你看我下面這個該怎麼去判斷比較合適呢?

int a =  b/c/m*n;   //b c m n都為正數

//小明想在這裡加個對a的判斷,畢竟e = f/a裡的a是除數不能為0嘛,一旦為0,e不知道會出現什麼莫名其妙的鬼東西

e = f/a;   

我:assert(0 != a); //如果我們認為a為0是絕不允許的,因為一旦發生表明int a =  b/c/m*n;可能這裡的計算出bug了,但這些變數都是正數,本身看起來好像沒問題,但就是擔心a為0,那我們就assert來試探試探;

if(0 == a) return; //而如果用if,就是你預設a可能為0,這裡如果用return返回來處理,如果程式中斷了還好,但如果不影響程式執行,就表明你計算a的值那裡埋下了bug,你卻發現不了,以後要是用到同樣的計算就出麻煩了。

小明:哥,大哥,我懂了,也就是assert在除錯期間用來檢查我的猜測或者決不允許出現的情況有沒有發生吧,一旦發生就表明我的程式很可能有bug,而if就是我理所應當處理的各種情況,且這些情況如果發生並不代表程式發生bug。所以,它們兩不能亂用。

小明:那。。。哥,那我上面對a的判斷明顯是該在debug模式下用assert來檢查下計算有沒有bug吧,如果用if,我就預設a可以為0了,,,我也就很可能發現不了計算中可能出現的bug了。

我:終於開竅了,師傅我領你進門,修行在你個人,師傅我也不一定說得全對,如果發現師傅有什麼不對的,你也可以指出來的,哈哈!!!

小明:哥,你真逗。

if與assert的區別

斷言 assert 的語義 如果表示式的值為0 假 則輸出錯誤訊息並終止程式的執行 一般還會出現提示對話方塊,說明在什麼地方引發了assert 如果表示式為真,則不進行任何操作,因此斷言失敗就表明程式存在乙個bug。使用assert的目的是捕捉執行時不應該發生的非法情況語義 如果表示式的值為真,則執...

ASSERT與VERIFY巨集的區別

1 assert與verify巨集在debug模式下作用基本一致,二者都對表示式的值進行計算,如果值為非0,則什麼事也不做 如果值為0,則輸出診斷資訊。2 assert與verify巨集在release模式下效果完全不一樣。assert不計算表示式的值,也不會輸出診斷資訊 verify計算表示式的值...

ASSERT與VERIFY巨集的區別

今天公司有同事問我assert與verify巨集有什麼區別,雖然平時常用這兩個巨集對一些變數在debug模式下作判斷,但一時還真答不上來二者之間的具體差別,看來只是知其然不知其所以然。後來查了一些資料,總算弄清楚了二者之間的區別,整理後與同事交流了一番,感覺收穫還是蠻大的。下面對我的理解進行了總結 ...