C語言高階剖析 8 goto 和 void 分析

2021-09-28 21:23:05 字數 2339 閱讀 7947

有乙個專案經驗:程式質量和 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

int main()

上面的**在ansi c編譯器中無法通過編譯,但是對於支援 gnu 標準的 gcc

編譯器而言是合法的,列印結果為:1

int

* pi =

(int*)

malloc

(sizeof

(int))

;char

* pc =

(char*)

malloc

(sizeof

(char))

;void

* p =

null

;int

* pni =

null

;char

* pnc =

null

;p = pi;

// ok

pni = p;

// 型別轉換

p = pc;

// ok

pnc = p;

// 型別轉換

對於上面的程式,函式的功能是把傳入位址的每個位元組的數值都變成 n, 為什麼要把 src 定義為void* 型別的指標呢,因為傳入的引數有多種型別,如int*, char*, double|* 等等,傳入不同的指標型別,都可以操作。

1、現代工程軟體中禁用 goto 語句

2、void 是一種抽象的資料型別,不能用於定義變數

3、void 型別用於宣告函式無引數,函式無返回值

4、可以定義void* 型別的指標,void* 型別的指標可以接受任意型別的指標值

《C語言高階剖析》課程目錄

第1課 基本資料型別 第2課 有符號數與無符號數 第3課 浮點數的秘密 第4課 型別轉換 第5課 變數屬性 第6課 分支語句 第7課 迴圈語句 第8課 goto和void分析 第9課 const 和 volatile分析 第10課 struct和union分析 第11課 enum,sizeof,ty...

C語言高階剖析 07 迴圈語句

迴圈語句分析 do while 的迴圈方式 程式設計實驗 三種迴圈語句使用對比 include int f1 int n while n 0 return ret int f2 int n return ret int f3 int n printf d i printf n void f2 int...

C語言高階剖析 7 迴圈語句

迴圈語句通過條件表示式判定是否執行迴圈體。迴圈語句有三種,do,while,for,三種區別如下 1 do while 語句的迴圈方式 2 while 語句的迴圈方式 3 for 語句的迴圈方式 for 迴圈有初始區,i 0 就是初始區 condition 是條件 迴圈終止區指的是 i 程式示例 三...