最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

c語言中assert斷言用法實(shí)例詳解

 更新時(shí)間:2024年02月07日 08:28:46   作者:權(quán)^  
斷言是C語言中一種用于檢查程序中假設(shè)語句正確性的方法,通過使用斷言,開發(fā)人員可以在程序中插入一些條件,以確保程序的執(zhí)行滿足特定的預(yù)期,這篇文章主要給大家介紹了關(guān)于c語言中assert斷言用法的相關(guān)資料,需要的朋友可以參考下

一、斷言的概念

assert.h 頭?件定義了宏 assert() ,用于在運(yùn)行時(shí)確保程序符合指定條件,如果不符合,就報(bào)錯(cuò)終止運(yùn)行。這個(gè)宏常常被稱為“斷言”。

二、assert斷言

assert(p != NULL);

上面代碼在程序運(yùn)行到這一行語句時(shí),驗(yàn)證變量 p 是否等于 NULL 。如果確實(shí)不等于 NULL ,程序繼續(xù)運(yùn)行,否則就會(huì)終止運(yùn)行,并且給出報(bào)錯(cuò)信息提升。assert() 宏接受?個(gè)表達(dá)式作為參數(shù)。如果該表達(dá)式為真(返回值非零),assert() 不會(huì)產(chǎn)?任何作用,程序繼續(xù)運(yùn)行。如果該表達(dá)式為假(返回值為零), assert() 就會(huì)報(bào)錯(cuò),在標(biāo)準(zhǔn)錯(cuò)誤流 stderr 中寫??條錯(cuò)誤信息,顯示沒有通過的表達(dá)式,以及包含這個(gè)表達(dá)式的文件名和行號(hào)。

2.1 代碼1

#include<stdio.h>
int main()
{
	int* p = NULL;
	assert(p != NULL);
	return 0;
}

2.1.1運(yùn)行結(jié)果

這里顯示assert未定義,需要包含頭文件

#include<assert.h>

完整代碼:

#include<stdio.h>
#include<assert.h>
int main()
{
	int* p = NULL;
	assert(p != NULL);
	return 0;
}

再次運(yùn)行,運(yùn)行結(jié)果:

2.1.2分析

報(bào)錯(cuò)會(huì)告訴你在哪一行。

2.2代碼2

#include<stdio.h>
#include<assert.h>
int main()
{
	int a = 10;
	int* p = &a;
	assert(p != NULL);
	printf("%d", *p);
	return 0;
}

2.2.1運(yùn)行結(jié)果

2.2.2分析

assert不等于 NULL ,程序繼續(xù)運(yùn)行,結(jié)果沒有報(bào)錯(cuò)。

2.3代碼3

#include<stdio.h>
#include<assert.h>
int main()
{
	int a = 0;
	scanf("%d", &a);
	assert(a>10);
	printf("%d", a);
	return 0;
}

2.3.1運(yùn)行結(jié)果及其分析

三、優(yōu)點(diǎn)

assert() 的使用對程序員是非常友好的,使用 assert() 有幾個(gè)好處:它不僅能?動(dòng)標(biāo)識(shí)文件和出問題的行號(hào),還有?種?需更改代碼就能開啟或關(guān)閉 assert() 的機(jī)制。如果已經(jīng)確認(rèn)程序沒有問題,不需要再做斷言,就在 #include <assert.h> 語句的前面,定義?個(gè)宏 NDEBUG 。

#define NDEBUG
#include <assert.h>

然后,重新編譯程序,編譯器就會(huì)禁用文件中所有的 assert() 語句。如果程序?出現(xiàn)問題,可以移除這條 #define NDBUG 指令(或者把它注釋掉),再次編譯,這樣就重新啟用了 assert() 語句。

代碼:

#include<stdio.h>
#define NDEBUG
#include<assert.h>
int main()
{
	int a = 0;
	scanf("%d", &a);
	assert(a>10);
	printf("%d", a);
	return 0;
}

運(yùn)行結(jié)果及其分析:

四、缺點(diǎn)

因?yàn)橐?了額外的檢查,增加了程序的運(yùn)行的時(shí)間。

五、注意

一般我們可以在 Debug 中使用,在 Release 版本中選擇禁用 assert 就行,在 VS 這樣的集成開發(fā)環(huán)境中,在 Release 版本中,直接就是優(yōu)化掉了。這樣在debug版本寫有利于程序員排查問題,在 Release 版本不影響用戶使用時(shí)程序的效率。

附:用法總結(jié)與注意事項(xiàng)

1)在函數(shù)開始處檢驗(yàn)傳入?yún)?shù)的合法性,如:

int resetBufferSize(int nNewSize){undefined
//功能:改變緩沖區(qū)大小,
//參數(shù):nNewSize 緩沖區(qū)新長度
//返回值:緩沖區(qū)當(dāng)前長度
//說明:保持原信息內(nèi)容不變 nNewSize<=0表示清除緩沖區(qū)
assert(nNewSize >= 0);
assert(nNewSize <= MAX_BUFFER_SIZE);

…
}

2)每個(gè)assert只檢驗(yàn)一個(gè)條件,因?yàn)橥瑫r(shí)檢驗(yàn)多個(gè)條件時(shí),如果斷言失敗,無法直觀的判斷是哪個(gè)條件失敗

不好: assert(nOffset>=0 && nOffset+nSize<=m_nInfomationSize);

好:

assert(nOffset >= 0);
assert(nOffset+nSize <= m_nInfomationSize);

3)不能使用改變環(huán)境的語句,因?yàn)閍ssert只在DEBUG中生效,如果這么做,會(huì)使用程序在真正運(yùn)行時(shí)遇到問題

錯(cuò)誤: assert(i++ < 100)

這是因?yàn)槿绻鲥e(cuò),比如在執(zhí)行之前i=100,那么這條語句就不會(huì)執(zhí)行,那么i++這條命令就沒有執(zhí)行。

正確:

assert(i < 100)
i++;

4)assert和后面的語句應(yīng)空一行,以形成邏輯和視覺上的一致感

總結(jié)

到此這篇關(guān)于c語言中assert斷言用法的文章就介紹到這了,更多相關(guān)c語言assert斷言詳解內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 基于C++詳解數(shù)據(jù)結(jié)構(gòu)(附帶例題)

    基于C++詳解數(shù)據(jù)結(jié)構(gòu)(附帶例題)

    數(shù)據(jù)結(jié)構(gòu)作為每一個(gè)IT人不可回避的問題,本文基于C++編寫,下面這篇文章主要給大家介紹了關(guān)于數(shù)據(jù)結(jié)構(gòu)的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-06-06
  • 常用的C語言編程工具匯總

    常用的C語言編程工具匯總

    c語言編程軟件適于編寫系統(tǒng)軟件,是學(xué)習(xí)編程的同學(xué)們的必備軟件。c語言一種非常強(qiáng)大的計(jì)算機(jī)語言,應(yīng)用非常廣泛,不僅僅是在軟件開發(fā)上,而且各類科研都會(huì)用到c語言。今天小編給大家匯總下C語言的編程工具
    2018-01-01
  • 詳解C++中的內(nèi)聯(lián)函數(shù)和函數(shù)重載

    詳解C++中的內(nèi)聯(lián)函數(shù)和函數(shù)重載

    這篇文章主要介紹了詳解C++中的內(nèi)聯(lián)函數(shù)和函數(shù)重載,是C++入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-09-09
  • C++中類的默認(rèn)成員函數(shù)詳解

    C++中類的默認(rèn)成員函數(shù)詳解

    大家好,本篇文章主要講的是C++中類的默認(rèn)成員函數(shù)詳解,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下
    2022-01-01
  • C++編程中new運(yùn)算符的使用學(xué)習(xí)教程

    C++編程中new運(yùn)算符的使用學(xué)習(xí)教程

    這篇文章主要介紹了C++編程中new運(yùn)算符的使用學(xué)習(xí)教程,是C++入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2016-01-01
  • 插入排序算法之希爾排序+直接插入排序

    插入排序算法之希爾排序+直接插入排序

    這篇文章主要介紹了插入排序算法之希爾排序+直接插入排序的相關(guān)知識(shí),本文通過實(shí)例圖文相結(jié)合給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-11-11
  • C語言字符串函數(shù),字符函數(shù),內(nèi)存函數(shù)使用及模擬實(shí)現(xiàn)

    C語言字符串函數(shù),字符函數(shù),內(nèi)存函數(shù)使用及模擬實(shí)現(xiàn)

    這篇文章主要介紹了C語言字符串函數(shù),字符函數(shù),內(nèi)存函數(shù)使用及模擬實(shí)現(xiàn),文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-09-09
  • 詳解C/C++性能優(yōu)化背后的方法論TMAM

    詳解C/C++性能優(yōu)化背后的方法論TMAM

    開發(fā)過程中我們多少都會(huì)關(guān)注服務(wù)的性能,然而性能優(yōu)化是相對比較困難,往往需要多輪優(yōu)化、測試,屬于費(fèi)時(shí)費(fèi)力,有時(shí)候還未必有好的效果。但是如果有較好的性能優(yōu)化方法指導(dǎo)、工具輔助分析可以幫助我們快速發(fā)現(xiàn)性能瓶頸所在,針對性地進(jìn)行優(yōu)化,可以事半功倍
    2021-06-06
  • C++實(shí)現(xiàn)一鍵關(guān)閉桌面的示例代碼

    C++實(shí)現(xiàn)一鍵關(guān)閉桌面的示例代碼

    這篇文章主要為大家詳細(xì)介紹了如何利用C++實(shí)現(xiàn)一鍵關(guān)閉桌面的功能,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的小伙伴可以了解一下
    2023-07-07
  • C++強(qiáng)制類型轉(zhuǎn)換(static_cast、dynamic_cast、const_cast、reinterpret_cast)

    C++強(qiáng)制類型轉(zhuǎn)換(static_cast、dynamic_cast、const_cast、reinterpret_ca

    本文主要介紹了C++強(qiáng)制類型轉(zhuǎn)換,主要介紹了static_cast、dynamic_cast、const_cast、reinterpret_cast的4種方法,感興趣的可以了解一下
    2021-08-08

最新評(píng)論

浏阳市| 桂林市| 巴彦县| 林甸县| 兰溪市| 青神县| 福安市| 中西区| 虞城县| 齐齐哈尔市| 鹤峰县| 昌江| 逊克县| 卫辉市| 墨脱县| 远安县| 荃湾区| 榆林市| 商南县| 涿鹿县| 蛟河市| 台中市| 丹巴县| 蕉岭县| 杭锦旗| 怀宁县| 泗洪县| 封开县| 阿瓦提县| 抚州市| 儋州市| 鸡西市| 米林县| 客服| 巍山| 乡宁县| 扶沟县| 巴东县| 蚌埠市| 长沙市| 敦化市|