文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>c 语言常见的修饰符

c 语言常见的修饰符

时间:2006-08-09  来源:bob_zhang2004

 
中国Linux论坛首页 技术论坛| 文章荟萃| 藏经阁| 项目计划| 在线调查| 网站镜像| 软件仓库| 关于本站|

讨论区列表 | 搜寻文章 | 我的论坛 | 标记已读 | 在线用户 | 常见问题 | 退出登录
Linux 环境下的程序设计
   >> C/C++编程版
此话题阅读次数: 366
上一篇  索引  下一篇  平坦模式  树状模式 

  加到“个人收藏夹”   |   打印
linuxhpu
(stranger)
06-08-04 21:45
[精华] c语言面试经常提问到的几个修饰符
回复 

static:修饰符:修饰变量,函数。作用域:变量仅仅在本文件可见,函数在本文件可以被调用。static在函数内部定义的话,分配在堆中,数值保存在data段,而不是在栈中,而且只赋值一次。
extern:修饰符:修饰变量,函数。修饰变量时候,变量的声明在外面,修饰函数的时候,如果函数已经声明,则作用不是很大。
const:修饰符:修饰变量,函数。修饰变量时候,不能被重复赋值,只能放在只读段中。修饰函数时候,表明函数的返回值必须为常数。
volatile:(嵌入式程序员必须掌握的)volatile最初的意思是表示汽油容易挥发,在c中的作用大概有两点(1)表示变量是易失的,易变的。(2)强制访存操作,防止编译器去优化,告诉编译器每次必须去内存中取值,而不是从寄存器或者缓存。

上面是我对几个变量修饰符的简单理解,肯定不全面,也会有错误,请达人或者高手赐教。
谢谢啦。

文章选项:      

linuxhpu
(stranger)
06-08-04 22:29
[精华] Re: c语言面试经常提问到的几个修饰符 [re: linuxhpu]
回复 

有位大哥说对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
欢迎大侠指正。

文章选项:      

Ahenl
(newbie)
06-08-06 11:05
[精华] Re: c语言面试经常提问到的几个修饰符 [re: linuxhpu]
回复 

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语法

文章选项:      

linuxhpu
(stranger)
06-08-06 21:30
[精华] Re: c语言面试经常提问到的几个修饰符 [re: Ahenl]
回复 

遇到传说中的高手了

文章选项:      

whenwhentea
(stranger)
06-08-08 17:16
[精华] Re: c语言面试经常提问到的几个修饰符 [re: linuxhpu]
回复 

的确很有高手风范。:P

--------------------
吃自助的最高境界: 扶墙进,扶墙出.

文章选项:      

linuxhpu
(stranger)
06-08-08 21:19
[精华] Re: c语言面试经常提问到的几个修饰符 [re: linuxhpu]
回复 

既然是精华帖了,就多写点。
思考:一个参数可以是const又可以是volatile吗?
我觉得应该是可以的,比如:只读的cpsr,定义它是volatile因为它可能被意想不到地改变,编译器不要省事去caching它,定义它是const是要求程序不应该试图去修改它。

文章选项:      

Ahenl
(newbie)
06-08-08 23:14
[精华] Re: c语言面试经常提问到的几个修饰符 [re: linuxhpu]
回复 

呵呵,本人也是菜菜.....

C标准允许三种修饰符const volatile和restrict的任意组合

C99甚至允许一种修饰符多次出现,不过这在C89里面是个错误

所以说
int x;
int const x;
int const volatile x;
...一共8种都是合法的。

在C99还有第n种,不过和上面8种之一有相同的语义

文章选项:      

softmaster
(journeyman)
06-08-08 23:30
[精华] Re: c语言面试经常提问到的几个修饰符 [re: linuxhpu]
回复 

const 与 volatile 共用在语法上是可以的,但在实际使用中是没有必要的。

const告诉编译器将该对象是只读的,可以将其放在只读内存段中进行优化。
volatile告诉编译器访问该对象时必须从内存中取值,不要使用寄存器中的cache。是一种阻止优化的机制。

如果一个对象具有了const的属性肯定就不需要有volatile的属性。

--------------------
我本楚狂人,凤歌笑孔丘

文章选项:      

Ahenl
(newbie)
06-08-09 00:32
[精华] Re: c语言面试经常提问到的几个修饰符 [re: softmaster]
回复 

语义上是有意义的!

“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){}......

文章选项:      

IN_FLAMES
(addict)
06-08-09 17:40
[精华] Re: c语言面试经常提问到的几个修饰符 [re: linuxhpu]
回复 

>只读的cpsr

cpsr是个啥?

--------------------
我是马甲

文章选项:      

linuxhpu
(newbie)
06-08-09 18:37
[精华] Re: c语言面试经常提问到的几个修饰符 [re: IN_FLAMES]
回复 

cpsr ,spsr 程序状态寄存器
比如:ARM7TDMI-S内核包含1个CPSR和5个SPSR供异常处理程序使用。等等
是不是我说错了?错的话,请指出来!

文章选项:      

softmaster
(journeyman)
06-08-09 19:22
[精华] Re: c语言面试经常提问到的几个修饰符 [re: Ahenl]
回复 

被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的另外一个作用。在语法检查的时候可以阻止不必要的内存访问。而不需要在运行期时再做检查

--------------------
我本楚狂人,凤歌笑孔丘

文章选项:      

  加到“个人收藏夹”   |   打印

上一篇  索引  下一篇  平坦模式  树状模式 
前往讨论区 *Linux 社区和文化* -----   社区公告栏   社区服务台   业界新闻与评论   自由软件杂谈   Linux软件快递   翻译作坊   Linux图书与评论   招聘和求职*Linux 桌面与办公自动化* -----   GNU Emacs/XEmacs   Linux 中文环境和中文化   Linux桌面与办公软件   Linux 多媒体与娱乐版   自由之窗Mozilla   笔记本电脑上的Linux*Linux 入门及网络应用* -----   Gentoo   Debian 一族   网络管理技术   Linux 安装与入门   WEB服务器和FTP服务器   域名服务器和邮件服务器   Linux防火墙和代理服务器应用   文件及打印服务器    技术培训与认证*Linux 高级应用* -----   Linux内核技术   Linux 嵌入技术   Linux设备驱动程序   Linux 集群技术   LINUX平台数据库   系统和网络安全   CPU 与 编译器   系统计算研究所专栏*Linux 环境下的程序设计* -----   Linux下的GUI软件开发   C/C++编程版   PHP 技 术   Java&jsp技术   Shell编程技术   Perl 编 程   Python 编 程   XML/Web Service 技术*永远的 UNIX* -----   永远的Unix   FreeBSD世界*IT 人生* -----   全球风云   IT 人生
Contact Us LINUXFORUM.NET
相关阅读 更多 +
排行榜 更多 +
进击的小动物安卓版

进击的小动物安卓版

飞行射击 下载
进攻yalghaar

进攻yalghaar

飞行射击 下载
深空战场

深空战场

飞行射击 下载