当前位置: 代码迷 >> C语言 >> 求教const和volatile的问题!!
  详细解决方案

求教const和volatile的问题!!

热度:295   发布时间:2008-02-26 13:17:58.0
求教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  变量  

----------------解决方案--------------------------------------------------------
const   volatile禁止编译器优化,所谓编译器优化是指当一个变量被声明为const时,编译器认为该变量在某一段代码(如一个函数)中不会发生改变,就会将该变量存储到CPU的寄存器,从CPU寄存器读写数据的速度要远远快于从内存读取数据。   
  const   volatile禁用了编译器优化,也就是说,不允许将该数据保存到CPU寄存器。   
  保存到CPU寄存器的变量可能在某些情况下被改编,例如,另一个线程可能会改变该寄存器得值,   这样就会导致你原本以为是const的变量发生了改变,导致了bug。   
  使用const   volatile声明就避免了这种情况。
----------------解决方案--------------------------------------------------------
纳闷好几天了,终于明白了!
非常感谢![bc04]
----------------解决方案--------------------------------------------------------
请问高手,我看到下面这个函数,里面并没有const修饰,这里面的volatile是有何作用呢??
void Delay(unsigned int delay_count)
{
    volatile unsigned int delay;
    for (delay = 0; delay < delay_count * 5000; delay++);
}
----------------解决方案--------------------------------------------------------
书上说volatile是限定变量的值,变量是可以被程序以外的不确定因素改变。
但具体我也不太清楚!
希望高手给予细说!
----------------解决方案--------------------------------------------------------
用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);
}

----------------解决方案--------------------------------------------------------
p先指向a的地址,然后改变该地址内的值;
p在指向b的地址,然后改变该地址内的值;
我运行了,结果是  2 2
这样的话const int a和const volatile int b 没起作用啊!
糊涂!不明白为什么?
也许是我的基础太差了,不知道能不能细说说?
----------------解决方案--------------------------------------------------------
违背语言标准,钻编译器漏洞有什么意思。
6楼的程序能否正常运行而不崩溃取决于你的编译器和操作系统,如果const变量被放置到只读属性的内存地址空间程序会因为异常而崩溃。

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

volatile常用于低级的接近硬件的编程,如计时器,I/O端口寄存器等,程序不改变volatile变量的值也可能会有其他因素改变,防止编译器将该变量放入寄存器中。
----------------解决方案--------------------------------------------------------
我记得C的实现者说过一句话,CONST只是给编译器一个提醒,编译器完全可以忽略
----------------解决方案--------------------------------------------------------
谢谢大家!
我会继续学习的!
----------------解决方案--------------------------------------------------------
  相关解决方案