| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2474 人关注过本帖
标题:求教const和volatile的问题!!
只看楼主 加入收藏
☆Jony☆
Rank: 1
等 级:新手上路
帖 子:70
专家分:0
注 册:2008-2-22
收藏
 问题点数:0 回复次数:10 
求教const和volatile的问题!!
本人正在看《c语言程序设计(c99版)》,清华大学出版社出版的。
基于此书介绍const能应用于任何变量定义语句,以说明其值是只读的,是不可改变的,对于数组,使用const,说明该数组的每一个元素都是不可修改的,是常量:例如
const double PI=3.14159265358979;
const char CUE[]="Please input a world";
volatile是限定变量的值是可以被程序以外的不确定因素改变。
基于以上介绍对于下面语句:
const volatile char *port=(const volatile char*)0x30;
问题:
(const volatile char*)其什么作用?我怎么感觉是多余呢?
请大家指点!!
Thank you!
搜索更多相关主题的帖子: const volatile 清华大学 char 变量 
2008-02-26 13:17
qfyzy
Rank: 2
等 级:论坛游民
威 望:1
帖 子:380
专家分:86
注 册:2008-2-17
收藏
得分:0 
const   volatile禁止编译器优化,所谓编译器优化是指当一个变量被声明为const时,编译器认为该变量在某一段代码(如一个函数)中不会发生改变,就会将该变量存储到CPU的寄存器,从CPU寄存器读写数据的速度要远远快于从内存读取数据。   
  const   volatile禁用了编译器优化,也就是说,不允许将该数据保存到CPU寄存器。   
  保存到CPU寄存器的变量可能在某些情况下被改编,例如,另一个线程可能会改变该寄存器得值,   这样就会导致你原本以为是const的变量发生了改变,导致了bug。   
  使用const   volatile声明就避免了这种情况。

当对C的经验增加时,它会显的很好用.----Dennis M Ritche如是说
2008-02-26 14:34
☆Jony☆
Rank: 1
等 级:新手上路
帖 子:70
专家分:0
注 册:2008-2-22
收藏
得分:0 
纳闷好几天了,终于明白了!
非常感谢![bc04]

☆滴水穿石☆水滴石穿☆
QQ:920633639
2008-02-26 14:59
young
Rank: 3Rank: 3
等 级:论坛游侠
威 望:2
帖 子:223
专家分:160
注 册:2004-9-5
收藏
得分:0 
请问高手,我看到下面这个函数,里面并没有const修饰,这里面的volatile是有何作用呢??
void Delay(unsigned int delay_count)
{
    volatile unsigned int delay;
    for (delay = 0; delay < delay_count * 5000; delay++);
}

如果你爱C语言,请你爱指针; 如果你爱指针,请你爱指针的指针;
2008-02-27 11:08
☆Jony☆
Rank: 1
等 级:新手上路
帖 子:70
专家分:0
注 册:2008-2-22
收藏
得分:0 
书上说volatile是限定变量的值,变量是可以被程序以外的不确定因素改变。
但具体我也不太清楚!
希望高手给予细说!

☆滴水穿石☆水滴石穿☆
QQ:920633639
2008-02-27 11:43
leeco
Rank: 4
等 级:贵宾
威 望:10
帖 子:1029
专家分:177
注 册:2007-5-10
收藏
得分:0 
用G++编译这个
程序代码:
#include <stdio.h>

int main()
{
    const int a=1;
    const volatile int b=1;
    int *p;
    p=(int*)&a;
    *p=2;
    p=(int*)&b;
    *p=2;
    printf("%d %d\n",a,b);
}
2008-02-27 15:57
☆Jony☆
Rank: 1
等 级:新手上路
帖 子:70
专家分:0
注 册:2008-2-22
收藏
得分:0 
p先指向a的地址,然后改变该地址内的值;
p在指向b的地址,然后改变该地址内的值;
我运行了,结果是  2 2
这样的话const int a和const volatile int b 没起作用啊!
糊涂!不明白为什么?
也许是我的基础太差了,不知道能不能细说说?

☆滴水穿石☆水滴石穿☆
QQ:920633639
2008-02-27 17:38
VxWorks
Rank: 3Rank: 3
来 自:WindRiver
等 级:论坛游民
威 望:6
帖 子:859
专家分:68
注 册:2007-11-24
收藏
得分:0 
违背语言标准,钻编译器漏洞有什么意思。
6楼的程序能否正常运行而不崩溃取决于你的编译器和操作系统,如果const变量被放置到只读属性的内存地址空间程序会因为异常而崩溃。

const声明只能帮助编译器发现直接的修改该变量的错误,即语法错误,毕竟编译器还没有智能到发现语义错误。

volatile常用于低级的接近硬件的编程,如计时器,I/O端口寄存器等,程序不改变volatile变量的值也可能会有其他因素改变,防止编译器将该变量放入寄存器中。

为了防止世界被破坏,为了守护世界的和平,贯彻爱与真实的邪恶,可爱又迷人的反派角色,VxWorks!
Don't ask me any question.I'm just here to buy soy sauce.
2008-02-27 17:50
qfyzy
Rank: 2
等 级:论坛游民
威 望:1
帖 子:380
专家分:86
注 册:2008-2-17
收藏
得分:0 
我记得C的实现者说过一句话,CONST只是给编译器一个提醒,编译器完全可以忽略

当对C的经验增加时,它会显的很好用.----Dennis M Ritche如是说
2008-02-27 18:17
☆Jony☆
Rank: 1
等 级:新手上路
帖 子:70
专家分:0
注 册:2008-2-22
收藏
得分:0 
谢谢大家!
我会继续学习的!

☆滴水穿石☆水滴石穿☆
QQ:920633639
2008-02-27 18:39
快速回复:求教const和volatile的问题!!
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.031550 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved