您好,登錄后才能下訂單哦!
我們在 C 語言中經(jīng)常會見到 void ,也會偶爾見到 goto。那么 C 語言中既然有 goto ,為什么我們在代碼中見的很少呢?在以前很多的項(xiàng)目經(jīng)驗(yàn)中,我們得到這樣一條潛規(guī)則:一般項(xiàng)目都是禁用 goto 的,程序質(zhì)量與 goto 的出現(xiàn)次數(shù)成反比。自后也就造成了我們一般不會使用 goto 。
我們來分析下面這個(gè)示例代碼,看看 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; }
那么在 function(1) 中,函數(shù)會正常執(zhí)行退出。在 function(-1) 中,函數(shù)則會發(fā)生段錯(cuò)誤,為什么呢?因?yàn)?goto 改變了函數(shù)的執(zhí)行流。指針 p 沒有申請就要使用并釋放。我們來看看編譯的結(jié)果是否如我們所想?經(jīng)過編譯, 我們發(fā)現(xiàn)雖然函數(shù)能編譯過,但是執(zhí)行的時(shí)候發(fā)生了段錯(cuò)誤。
下來我們來講講 void 。當(dāng)函數(shù)沒有返回值時(shí),應(yīng)將其聲明為 void;如果函數(shù)沒有參數(shù),應(yīng)將其參數(shù)聲明為 void ;void 修飾函數(shù)返回值和參數(shù)是為了表示“無”。那么在 C 語言中,到底有沒有定義 void 的內(nèi)存大小呢?在標(biāo)準(zhǔn)的 C 中是沒有定義它的大小的,但是在一些 C 的擴(kuò)展編譯器中定義了。比如在 gcc 編譯器中就定義 void 的大小為 1。我們可以在 gcc 編譯器中試下,結(jié)果如下所示:
那么對于 void 指針有什么意義呢?C 語言規(guī)定只有相同類型的指針才能相互賦值,void* 指針作為左值用于“接收”任意類型的指針,void* 指針作為右值使用時(shí)需要進(jìn)行強(qiáng)制類型轉(zhuǎn)換。
我們來通過 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; }
我們可以看到因?yàn)?MemSet 函數(shù)的第一個(gè)參數(shù)為 void* ,所以數(shù)組 a 的類型不管是 int、char、float還是 double,都不會報(bào)錯(cuò)。但是如果我們規(guī)定的是 int* 的話,下面數(shù)組 a 的類型為 double 的話,就會報(bào)錯(cuò)。我們改成這樣試試,看編譯器是否會報(bào)錯(cuò)。效果如下:
那么我們本次學(xué)習(xí)了 goto 和 void,通過本次學(xué)習(xí),總結(jié)如下:1、在現(xiàn)在的項(xiàng)目工程中一般是禁用 goto 語句的;2、void 是一種抽象的數(shù)據(jù)類型;3、void 類型不能用于定義變量、但可以用來聲明函數(shù)無參數(shù)、無返回值;4、可以定義 void* 類型的指針;5、void* 類型的指針可以接受任意類型的指針值。后面我們會繼續(xù)對 C 語言的學(xué)習(xí)。
歡迎大家一起來學(xué)習(xí) C 語言,可以加我QQ:243343083。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。