當前位置:才華齋>計算機>C語言>

C語言volatile與const同時使用應注意的問題

C語言 閱讀(2.24W)

const最主要的特點就是隻讀,有常量、常量指標,如果不是特別小心的分析C語言語句的書寫格式,再加上指標的使用,就特別容易弄錯。volatile關鍵字是一個型別修飾符,用它宣告的型別變量表示可以被某些編譯器未知的因素更改,下面就有小編分享C語言volatile與const同時使用應注意的問題,歡迎大家學習!

C語言volatile與const同時使用應注意的問題

const和volatile放在一起的意義在於:

(1)本程式段中不能對a作修改,任何修改都是非法的,或者至少是粗心,編譯器應該報錯,防止這種粗心;

(2)另一個程式段則完全有可能修改,因此編譯器最好不要做太激進的優化。

“const”含義是“請做為常量使用”,而並非“放心吧,那肯定是個常量”。

“volatile”的含義是“請不要做沒譜的'優化,這個值可能變掉的”,而並非“你可以修改這個值”。

因此,它們本來就不是矛盾的。

const修飾的變數不允許這裡修改不代表不允許別處修改,比如:

複製程式碼 程式碼如下:

int i = 5;

const int* p = &i;

*p = 6; // 不可以;

i = 7; // 完全可以,而且那個“const”的“*p”也跟著變成了7。

對於非指標非引用的變數,const volatile同時修飾的意義確實不大。個人覺得。

需要明白“volatile”的含義並非是“non-const”。所以他們才可以放在一起。

在C++語言中,const沒有反義詞,如果一個變數沒有const修飾,那它本身就是const的反義詞,而並非加上volatile才是const的反義詞。

兩者同時修飾一個物件的典型情況,是用於驅動中訪問外部裝置的只讀暫存器。

留一個問題:const volatile int i=10;這行程式碼有沒有問題?如果沒有,那 i 到底是什麼 屬性?

回答一:沒有問題,例如只讀的狀態暫存器。它是volatile,因為它可能被意想不到地改變;它是const,因為程式不應該試圖去修改它。volatile和const並不矛盾,只是控制的範圍不一樣,一個在程式本身之外,另一個是程式本身。

回答二:沒問題,const和volatile這兩個型別限定符不矛盾。const表示(執行時)常量語義:被const修飾的物件在所在的作用域無法進行修改操作,編譯器對於試圖直接修改const物件的表示式會產生編譯錯誤。volatile表示“易變的”,即在執行期物件可能在當前程式上下文的控制流以外被修改(例如多執行緒中被其它執行緒修改;物件所在的儲存器可能被多個硬體裝置隨機修改等情況):被volatile修飾的物件,編譯器不會對這個物件的操作進行優化。一個物件可以同時被const和volatile修飾,表明這個物件體現常量語義,但同時可能被當前物件所在程式上下文意外的情況修改。另外,LS錯誤,const可以修飾左值,修飾的物件本身也可以作為左值(例如陣列)。