面试时经常问的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语法  

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