1. 程式人生 > >const和volatile變數是否可以同時修飾一個變數

const和volatile變數是否可以同時修飾一個變數

問題:const和volatile是否可以同時修飾一個變數?有什麼含義?

答案:如果一個變數不會被本程式改變,通常可能給它加上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;  
}