问题:const和volatile是否可以同时修饰一个变量?有什么含义?
此处用volatile就显得画蛇添足了.
1.因为在求平方的时候 ,确实很可能外部改变了内存值 ,导致第一次取的值*ptr和第二次取的不一样的. 导致结果不是平方
2.返回值,即平方会很大 ,所以返回值用 unsigned long为好.
答案:如果一个变量不会被本程序改变,通常可能给它加上const,但如果该变量可能被其他程序改变而本程序又在检测这个变量的值,就需要给它加上volatile,于是变量就同时有volatile和const了,这个时候i具有const和volatile的双重属性。i变量不可以在编译过程中被程序代码修改,同时编译器不得对i进行优化编译。
例如
硬件时钟一般设定为不能由程序改变,这一点使它成为const;但它被程序以外的代理改变,这使它成为volatile的。只需在声明中同时使用这两个限定词,如下所示:
顺序并不重要:
volatile const int loc;
const volatile int*ploc;
假定没有被修改,告诉编译器可以被代理修改。
const和volatile是可以同时修饰一个变量的 const只是表示变量只读 不能出现在赋值号左边 防止程序“意外”修改 并且编译器一定会做优化 不会每次去内存取值 这个时候如果外部事件 如中断服务程序 改了这个变量的内存值 那么由于编译器优化就不会出有反应 这样会导致错误 加上volatile就告诉编译器 不要做任何优化 并且每次都去内存取值 而且这个变量不可以当左值使用 .
例如:求平方的函数
int square(volatile int *ptr)
{
return *ptr * *ptr;
}
此处用volatile就显得画蛇添足了.
1.因为在求平方的时候 ,确实很可能外部改变了内存值 ,导致第一次取的值*ptr和第二次取的不一样的. 导致结果不是平方
2.返回值,即平方会很大 ,所以返回值用 unsigned long为好.
unsigned long square(int a)
{
return a * a;
}