有一個項目經驗:程式品質和 goto 的出現次數成反比。是以在程式中要盡量避免使用 goto
下面就通過一個執行個體分析一下 goto 的副作用
上面的程式如果 n 小于 0,程式直接goto status,跳過 malloc,沒有配置設定記憶體,p 為空指針,對 p[0] 指派會導緻程式崩潰。
void 用于修飾函數傳回值和參數。如果一個函數沒有傳回值,應該将其聲明為 void;如果函數沒有參數,應該将其聲明為 void
小問題:函數沒有傳回值,直接不寫傳回值不就行了嗎,函數沒有參數,直接不寫參數不就行了。
下面我們來嘗試一下:
對上面的結果:編譯通過,運作通過,有一條警告,沒有傳回值預設為 int。 1、對于沒有傳回值類型的函數,預設傳回值類型為 int 2、對于沒有參數的函數,預設參數個數為任意個
是以,void 修飾函數傳回值和參數是為了表示“無”,沒有傳回值類型,沒有參數
c 語言沒有定義 void 究竟是多大記憶體的别名,這個模子沒有大小,是以在無法從記憶體中裁剪出 void 對應的變量。不存在 void 類型的變量,但是有 void 類型的指針。
比如:void var;void array[5] 是不合法的;void* p是合法的。
小貼士:c 語言規範包括兩部分,1、ansi c:标準 c 語言規範;2、擴充 c:在ansi c基礎上進行了擴充 不同公司在制作自己編譯器的時候,對标準 c 語言規範做出了擴充看如下代碼 #include<stdio.h> int main(){ printf("%ld\n", sizeof(void)); return 0; } 上面的代碼在ansi c編譯器中無法通過編譯,但是對于支援 gnu 标準的 gcc 編譯器而言是合法的,列印結果為:1
c 語言規定隻有相同類型的指針才可以互相指派
void* 指針作為左值用于‘接收’任意類型的指針
void* 指針作為右值使用時需要進行強制類型轉換
對于上面的程式,函數的功能是把傳入位址的每個位元組的數值都變成 n, 為什麼要把 src 定義為void* 類型的指針呢,因為傳入的參數有多種類型,如int*, char*, double|* 等等,傳入不同的指針類型,都可以操作。
1、現代工程軟體中禁用 goto 語句
2、void 是一種抽象的資料類型,不能用于定義變量
3、void 類型用于聲明函數無參數,函數無傳回值
4、可以定義void* 類型的指針,void* 類型的指針可以接受任意類型的指針值