c語言的一些關鍵字

關鍵字

保留關鍵字

char    short     int     unsigned  
long    float     double  struct  
union   void      enum    signed  
const   volatile  typedef auto  
case    continue  default do  
else    for goto  if  
return  switch    while   sizeof  
static  extern    break  register 

C99新增關鍵字

_Bool   _Complex    _Imaginary  inline  restrict

const

const定義常量從彙編的角度來看,只是給出了對應的內存地址,而不是像#define一樣給出的是立即數,所以,const定義的常量在程序運行過程中只有一份拷貝,而#define定義的常量在內存中有若干份拷貝。
編譯器通常不爲普通const常量分配存儲空間,而是將它們保存在符號表中,這使得它成爲一個編譯期間的常量,沒有了存儲與讀內存的操作,使得它的效率也很高。

例:下面的代碼編譯器會報一個錯誤,請問,哪一個語句是錯誤的呢?

typedef char * pStr;
char string[4] = "bbc";
const char *p1 =" string"; //1式
const pStr p2 =" string"; //2式
p1++;
p2++;

答案與分析:
問題出在p2++上。
1)const使用的基本形式: const type m;限定m不可變。替換基本形式中的m爲1式中的*p1,替換後const char *p1;限定*p1不可變,當然p1是可變的,因此問題中p1++是對的。
替換基本形式中的type爲2式中的pStr,替換後const pStr m;限定m不可變,題中的pStr就是一種新類型,因此問題中p2不可 變,p2++是錯誤的。
const只修飾其後的變量 ,至於const放在類型前還是類型後並沒有區別。如:const int a和int const a都是修飾a爲const。注意*不是一種類型,如果*pType之前是某類型,那麼pType是指向該類型的指針。
一個簡單的判斷方法:指針運算符*,是從右到左,那麼如:char const *pContent,可以理解爲char const (* pContent),即* pContent爲const,而pContent則是可變的。
在c中,對於const定義的指針,不賦初值編譯不報錯,強烈建議在初始化時說明指針的指向,防止出現野指針。

還有const int *p=&b;是可以的 雖然b不是常量。
但是

const int a=6;
int *p=&a;

會警告,因爲它消除了a的const屬性。

enum

(1) 枚舉型是一個集合,集合中的元素(枚舉成員)是一些命名的整型常量,元素之間用逗號,隔開。
(2) DAY是一個標識符,可以看成這個集合的名字,是一個可選項,即是可有可無的項。
(3) 第一個枚舉成員的默認值爲整型的0,後續枚舉成員的值在前一個成員上加1。
(4) 可以人爲設定枚舉成員的值,從而自定義某個範圍內的整數。
(5) 枚舉型是預處理指令#define的替代。
(6) 類型定義以分號;結束。
既然枚舉也是一種數據類型,那麼它和基本數據類型一樣也可以對變量進行聲明。

方法一:枚舉類型的定義和變量的聲明分開

enum DAY
{
  MON=1, TUE, WED, THU, FRI, SAT, SUN
};

enum DAY yesterday;
enum DAY today;
enum DAY tomorrow; //變量tomorrow的類型爲枚舉型enum DAY
enum DAY good_day, bad_day; //變量good_day和bad_day的類型均爲枚舉型enum DAY

方法二:類型定義與變量聲明同時進行

enum //跟第一個定義不同的是,此處的標號DAY省略,這是允許的。
{
saturday,
sunday = 0,
monday,
tuesday,
wednesday,
thursday,
friday
} workday; //變量workday的類型爲枚舉型enum DAY
enum week { Mon=1, Tue, Wed, Thu, Fri Sat, Sun} days; //變量days的類型爲枚舉型enum week
enum BOOLEAN { false, true } end_flag, match_flag; //定義枚舉類型並聲明瞭兩個枚舉型變量

方法三:用typedef關鍵字將枚舉類型定義成別名,並利用該別名進行變量聲明:

typedef enum workday
{
 saturday,
sunday = 0,
monday,
tuesday,
wednesday,
thursday,
friday
} workday; //此處的workday爲枚舉型enum workday的別名


workday today, tomorrow; //變量today和tomorrow的類型爲枚舉型workday,也即enum    workday

enum workday中的workday可以省略:

typedef enum
{
saturday,
sunday = 0,
monday,
tuesday,
wednesday,
thursday,
friday
} workday; //此處的workday爲枚舉型enum workday的別名

workday today, tomorrow; //變量today和tomorrow的類型爲枚舉型workday,也即enum workday

也可以用這種方式:

typedef enum workday
{
saturday,
sunday = 0,
monday,
tuesday,
wednesday,
thursday,
friday
};

workday today, tomorrow; //變量today和tomorrow的類型爲枚舉型workday,也即enum workday

注意:同一個程序中不能定義同名的枚舉類型,不同的枚舉類型中也不能存在同名的命名常量。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章