const和volatile變數是否可以同時修飾一個變數
阿新 • • 發佈:2019-02-02
問題: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;
}