一般來說,編碼的水平與 goto 語句使用的次數成反比。
個人主張,禁用 goto 語句。
1、void 修飾函數返回值和參數
1> 如果函數沒有返回值,那麼應將其聲明為void 類型。2> 如果函數無參數,那麼應聲明其參數為void
2、void 指針
1> 不能對void 指針進行算法操作2> 如果函數的參數可以使任意類型指針,那麼應聲明其參數為 void*
3、void不能代表一個真實的變量
return 用來終止一個函數 並 返回其後面跟著的值。
return (Val); // 此括號可以省略,但一般不省略,尤其在返回一個表達式的值時;
注: 1> 一個函數內可以有多個 return 語句,但只有一個 return 語句被執行
2> return 語句不可返回指向 "棧內存" 的 "指針", 因為該內存在函數結束時被自動銷毀。
1、const 修飾的只讀變量
定義 const 只讀變量,具有不可變性。注: const 修飾的只讀變量必須在定義的同時初始化。
2、節省空間,避免不必要的內存分配,同時提高效率
編譯器通常不為普通 const 只讀變量分配內存空間,而是將他們保存在符號表中,這使得他成為一個編譯器期間的值,沒有了存儲與讀內存的操作,使得它的效率也很高。
3、修飾一般變量
int const i = 2; 或 const int i = 2;
4、修飾數組
只讀數組: int const a[5] = {1,2,3,4,5};const int a[5] = {1,2,3,4,5};
5、修飾指針
const int *p; // p可變, p指向的對象不可變int const *p; // p可變, p指向的對象不可變int *const *p;// p不可變, p指向的對象可變const int *const *p;// 指針p和p指向的對象都不可變
6、修飾函數的參數
當不希望參數值在函數體內被意外改變時使用。例: void Fun(const int i);
7、修飾函數的返回值
1> const 修飾符也可以修飾函數的返回值,返回值不可被改變。例: const int Fun(void);2> 在另一連接文件中引用 const 只讀變量extern const int i;// 正確的聲明extern const int j = 10;// 錯誤,只讀變量的值不能改變
volatile 是易變的、不穩定的意思。
volatile 關鍵字 和 const 一樣是一種類型修飾符,用它修飾的變量表示可以被某些編譯器未知的因素改變,比如操作系統、
當引用另一個文件中定義的變量或函數時,使用 extern 進行聲明
struct 是一個神奇的關鍵字,它將一些相關聯的數據打包成一個整體,方便使用。
1、結構體的大小
2、柔性數組
union 關鍵字的用法與 struct 的用法非常類似。
union 維護足夠的空間來放置多個數據成員中的 "一種",而不是為每個數據成員配置空間。在union中所有的數據成員公用一個空間,同一時間只能存儲其中一個數據成員,所有的數據成員具有相同的起始地址。
枚舉 與 #define 宏的區別
1> #define 宏常量是在預編譯階段進行簡單替換; 枚舉常量則是在編譯的時候確定其值
2> 一般在編譯器裡,可以調試枚舉常量,但不能調試宏常量。
3> 枚舉可以一次定義大量相關的常量,而#define 宏 一次只能定義一個。
注意typedef 與 #define 的區別
#define INT32 int
unsigned INT32 i = 10;// 正確
typedef int int32;
unsigned int32 j = 10;// 編譯錯誤