const关键字可以说是用途广泛,从对变量的限定到对函数的限定,尤其是那个指向常量的指针(const int *p),指针常量(int * const p),指向常量的指针常量(const int* const p)更让初学者摸不到头脑。这里我主要想描述下最近项目中关于const的一个问题。简单代码如下:
int main()
{
const int a = 100;
int* p = (int *)&a;
*p = 200;
printf("\n%x\t%d", p, *p);
printf("\n%x\t%d", &a, a);
return 0;
}
VC 6.0 运行结果:
12ff7c 200
12ff7c 100
我看了下跟踪到内存12ff7c里确实放着200,这让我百思不得其解。于是我用gcc version 3.2.2 20030222
运行结果如下:
bfffdee4 200
bfffdee4 200
那么经过跟高手讨教得出:
第二个PRINTF打印出的100不是当时a的内容,而是vc 6.0编译优化,看见const后,直接将100放在要打印的a的地方,类似于#define,所以输出的还是100。那么最好的是使用volatile const int a = 100,一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。所以。。。
经过这个东西我看到了其实除了学习c++语言本身外,还是要了解一些编译器的基本信息,是不是应该开编译选项之类的值得我们去深思。