面試時經常問的c變量定義的問題.

static:修飾符:修飾變量,函數。作用域:變量僅僅在本文件可見,函數在本文件可以被調用。static在函數內部定義的話,分配在堆中,數值保存在data段,而不是在棧中,而且只賦值一次。
extern:修飾符:修飾變量,函數。修飾變量時候,變量的聲明在外面,修飾函數的時候,如果函數已經聲明,則作用不是很大。
const:修飾符:修飾變量,函數。修飾變量時候,不能被重複賦值,只能放在只讀段中。修飾函數時候,表明函數的返回值必須爲常數。
volatile:(嵌入式程序員必須掌握的)volatile最初的意思是表示汽油容易揮發,在c中的作用大概有兩點(1)表示變量是易失的,易變的。(2)強制訪存操作,防止編譯器去優化,告訴編譯器每次必須去內存中取值,而不是從寄存器或者緩存。 

const int nValue; //nValue是const
const char *pContent; //*pContent是const, pContent可變
const (char *) pContent;//pContent是const,*pContent可變
char* const pContent; //pContent是const,*pContent可變
const char* const pContent; //pContent和*pContent都是const
int const nValue; // nValue是const
char const * pContent;// *pContent是const, pContent可變
(char *) const pContent;//pContent是const,*pContent可變
char* const pContent;// pContent是const,*pContent可變
char const* const pContent;// pContent和*pContent都是const 

static和extern是specifier即限定符
const和volatile是qualifier即修飾符,他們在grammar上是有區別的


“const (char *) p”根本不符合C語法


static和extern要從作用域,生存週期和linkage三個方面來考慮
const的語義是隻讀,即不要通過某左值修改其內容,但是可能通過其它左值修改,放在只讀段只是某種實現方式

volatile提示編譯器,由於異步操作,不要caching。。。


根據C的grammar
declaration-specifiers:
storage-class-specifier declaration-specifiersopt
type-specifier declaration-specifiersopt
type-qualifier declaration-specifiersopt
function-specifier declaration-specifiersopt
對於x的聲明int const static x;type-specifier int,type-qualifier const和storage-class-specifier static的順序語法上是任意的。語義上是相同的。


根據C的grammar
declarator:
pointeropt direct-declarator
pointer:
* type-qualifier-listopt
* type-qualifier-listopt pointer

可見int const * x與int * const x的不同:第一個const被歸約爲declaration-specifier,而第二個被歸約爲type-qualifier-list.....


“const (char *) p”根本不符合C語法  

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