(stranger) 06-08-04 21:45
|
[精华] c语言面试经常提问到的几个修饰符 |
| |
static:修饰符:修饰变量,函数。作用域:变量仅仅在本文件可见,函数在本文件可以被调用。static在函数内部定义的话,分配在堆中,数值保存在data段,而不是在栈中,而且只赋值一次。 extern:修饰符:修饰变量,函数。修饰变量时候,变量的声明在外面,修饰函数的时候,如果函数已经声明,则作用不是很大。 const:修饰符:修饰变量,函数。修饰变量时候,不能被重复赋值,只能放在只读段中。修饰函数时候,表明函数的返回值必须为常数。 volatile:(嵌入式程序员必须掌握的)volatile最初的意思是表示汽油容易挥发,在c中的作用大概有两点(1)表示变量是易失的,易变的。(2)强制访存操作,防止编译器去优化,告诉编译器每次必须去内存中取值,而不是从寄存器或者缓存。
上面是我对几个变量修饰符的简单理解,肯定不全面,也会有错误,请达人或者高手赐教。 谢谢啦。
文章选项: |
(stranger) 06-08-04 22:29
|
[精华] Re: c语言面试经常提问到的几个修饰符 [] |
| |
有位大哥说对const的解释不全,所以增加以后一些内容。 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 欢迎大侠指正。
文章选项: |
(newbie) 06-08-06 11:05
|
[精华] Re: c语言面试经常提问到的几个修饰符 [] |
| |
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语法
文章选项: |
(stranger) 06-08-06 21:30
|
[精华] Re: c语言面试经常提问到的几个修饰符 [] |
| |
遇到传说中的高手了
文章选项: |
(stranger) 06-08-08 17:16
|
[精华] Re: c语言面试经常提问到的几个修饰符 [] |
| |
的确很有高手风范。:P
-------------------- 吃自助的最高境界: 扶墙进,扶墙出.
文章选项: |
(stranger) 06-08-08 21:19
|
[精华] Re: c语言面试经常提问到的几个修饰符 [] |
| |
既然是精华帖了,就多写点。 思考:一个参数可以是const又可以是volatile吗? 我觉得应该是可以的,比如:只读的cpsr,定义它是volatile因为它可能被意想不到地改变,编译器不要省事去caching它,定义它是const是要求程序不应该试图去修改它。
文章选项: |
(newbie) 06-08-08 23:14
|
[精华] Re: c语言面试经常提问到的几个修饰符 [] |
| |
呵呵,本人也是菜菜.....
C标准允许三种修饰符const volatile和restrict的任意组合
C99甚至允许一种修饰符多次出现,不过这在C89里面是个错误
所以说 int x; int const x; int const volatile x; ...一共8种都是合法的。
在C99还有第n种,不过和上面8种之一有相同的语义
文章选项: |
(journeyman) 06-08-08 23:30
|
[精华] Re: c语言面试经常提问到的几个修饰符 [] |
| |
const 与 volatile 共用在语法上是可以的,但在实际使用中是没有必要的。
const告诉编译器将该对象是只读的,可以将其放在只读内存段中进行优化。 volatile告诉编译器访问该对象时必须从内存中取值,不要使用寄存器中的cache。是一种阻止优化的机制。
如果一个对象具有了const的属性肯定就不需要有volatile的属性。
-------------------- 我本楚狂人,凤歌笑孔丘
文章选项: |
(newbie) 06-08-09 00:32
|
[精华] Re: c语言面试经常提问到的几个修饰符 [] |
| |
语义上是有意义的!
“const告诉编译器将该对象是只读的,可以将其放在只读内存段中进行优化。”这个有待商榷。
const的语义是某个左值是只读的,但并不能防止通过程序内部或外部的方法修改它,另外被const修饰的左值不一定属于只读段,下面一个例子:
e.g.
{//inner block
char c;
char const * p;
p=&c;
*p;
}
这里表达式(*p)求得的左值被const qualifier修饰,而该左值属于栈空间
再说一种情况吧: 与storage-class-specifier不同,type-qualifier可以修饰struct域内变量 struct tag { const int a; int b; }sa; 如果具有const修饰符的左值都要放在只读区的话,那sa放在哪里?
其实最简单的例子是:f(const int p){}......
文章选项: |
(addict) 06-08-09 17:40
|
[精华] Re: c语言面试经常提问到的几个修饰符 [] |
| |
>只读的cpsr
cpsr是个啥?
-------------------- 我是马甲
文章选项: |
(newbie) 06-08-09 18:37
|
[精华] Re: c语言面试经常提问到的几个修饰符 [] |
| |
cpsr ,spsr 程序状态寄存器 比如:ARM7TDMI-S内核包含1个CPSR和5个SPSR供异常处理程序使用。等等 是不是我说错了?错的话,请指出来!
文章选项: |
(journeyman) 06-08-09 19:22
|
[精华] Re: c语言面试经常提问到的几个修饰符 [] |
| |
被const修饰的对象当然不一定放在只读段,这完全依赖于编译器的实现。
你举的几个例子很有意思,分析一下:
第一个例子: { char c;
char const * p;
p=&c;
*p ; }
p 是一个指向 const char 的指针。在这里面没有任何对象被申明成 const, 所以编译器不会将任何对象放在只读段中。
第二个例子: struct tag { const int a ; int b ; } sa ;
为什么a不能放在只读区呢?这完全依赖于编译器的实现。
第三个例子 f( const int p) {}
这说明了const的另外一个作用。在语法检查的时候可以阻止不必要的内存访问。而不需要在运行期时再做检查
-------------------- 我本楚狂人,凤歌笑孔丘
文章选项: |