C語(yǔ)言詳細(xì)分析講解關(guān)鍵字goto與void的作用
一、關(guān)于goto
- 高手潛規(guī)則:禁用 goto
- 項(xiàng)目經(jīng)驗(yàn):程序質(zhì)量與 goto 的出現(xiàn)次數(shù)成反比
- 最后的判決:將 goto 打入冷宮
下面看一段 goto 副作用分析的代碼:
#include <stdio.h> #include <malloc.h> void func(int n) { int* p = NULL; if( n < 0 ) { goto STATUS; } p = (int*)malloc(sizeof(int) * n); STATUS: p[0] = n; free(p); } int main() { printf("begin...\n"); printf("func(1)\n"); func(1); printf("func(-1)\n"); func(-1); printf("end...\n"); return 0; }
下面為輸出結(jié)果:
這段代碼中當(dāng) func 的入口參數(shù) n 的值小于 0 時(shí),就會(huì) goto 到STATUS 那里去執(zhí)行代碼,但是由于跳過(guò)了分配內(nèi)存環(huán)節(jié),就不能把 n 的值賦給 p[0],強(qiáng)行賦值就會(huì)發(fā)成段錯(cuò)誤。
二、void 的意義
void 修飾函數(shù)返回值和參數(shù)
- 如果函數(shù)沒(méi)有返回值,那么應(yīng)該將其聲明為 void
- 如果函數(shù)沒(méi)有參數(shù),應(yīng)該聲明其參數(shù)為 void
void 修飾函數(shù)返回值和參數(shù)是為了表示“無(wú)”
下面這段代碼就表示 f 函數(shù)的輸入?yún)?shù)沒(méi)有限制。
不存在 void 變量
- C語(yǔ)言沒(méi)有定義 void 究竟是多大內(nèi)存的別名
- 沒(méi)有 void 的標(biāo)尺
- 無(wú)法在內(nèi)存中裁剪出 void 對(duì)應(yīng)的變量
在下面的代碼中,只有 void* 那條語(yǔ)句可以編譯通過(guò),因?yàn)?void* 指針是合法的。
小貼士
- ANSI C:標(biāo)準(zhǔn) C 語(yǔ)言的規(guī)范
- 擴(kuò)展C:在 ANSI C 的基礎(chǔ)上進(jìn)行了擴(kuò)充
上面的代碼在 ASNI C編譯器中無(wú)法通過(guò)編譯,但是對(duì)于支持 GNU 標(biāo)準(zhǔn)的 gcc 編譯器而言是合法的。
void 指針的意義
- C 語(yǔ)言規(guī)定只有相同類型的指針才可以相互賦值
- void* 指針作為左值用于“接收”任意類型的指針
- void* 指針作為右值使用時(shí)需要進(jìn)行強(qiáng)制類型轉(zhuǎn)換
下面看一段通過(guò) void* 實(shí)現(xiàn) MemSet 函數(shù)的代碼:
#include <stdio.h> void MemSet(void* src, int length, unsigned char n) { unsigned char* p = (unsigned char*)src; int i = 0; for(i=0; i<length; i++) { p[i] = n; } } int main() { int a[5]; int i = 0; MemSet(a, sizeof(a), 0); for(i=0; i<5; i++) { printf("%d\n", a[i]); } return 0; }
下面為輸出結(jié)果:
void* 定義的 src 表示可以接收任意類型的指針,所以數(shù)組 a 可以是任意類型。
三、小結(jié)
- 現(xiàn)代軟件工程中禁用 goto 語(yǔ)句
- void 是一種抽象的數(shù)據(jù)類型
- void 類型不能用于定義變量
- void 類型用于聲明函數(shù)無(wú)參數(shù)
- void 類型用于聲明函數(shù)無(wú)返回值
- 可以定義 void* 類型的指針
- void* 類型的指針可以接受任意類型的指針值
到此這篇關(guān)于C語(yǔ)言詳細(xì)分析講解關(guān)鍵字goto與void的作用的文章就介紹到這了,更多相關(guān)C語(yǔ)言goto與void內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++中關(guān)于多態(tài)實(shí)現(xiàn)和使用方法
這篇文章主要介紹了C++中關(guān)于多態(tài)實(shí)現(xiàn)和使用方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07C語(yǔ)言實(shí)現(xiàn)輸入兩個(gè)數(shù)字將其按從小到大輸出的方法
這篇文章主要介紹了C語(yǔ)言實(shí)現(xiàn)輸入兩個(gè)數(shù)字將其按從小到大輸出的方法,本文通過(guò)代碼講解的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-04-04Windows注冊(cè)表中修改UAC(用戶賬號(hào)控制)及批處理腳本
今天小編就為大家分享一篇關(guān)于Windows注冊(cè)表中修改UAC(用戶賬號(hào)控制)及批處理腳本,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2018-12-12C++實(shí)現(xiàn)高校人員信息管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)高校人員信息管理系統(tǒng)項(xiàng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-06-06從頭學(xué)習(xí)C語(yǔ)言之if語(yǔ)句的使用
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言之if語(yǔ)句的使用,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助2022-01-01