C語言 volatile與const同時使用應(yīng)注意的問題
const和volatile放在一起的意義在于:
(1)本程序段中不能對a作修改,任何修改都是非法的,或者至少是粗心,編譯器應(yīng)該報錯,防止這種粗心;
(2)另一個程序段則完全有可能修改,因此編譯器最好不要做太激進(jìn)的優(yōu)化。
“const”含義是“請做為常量使用”,而并非“放心吧,那肯定是個常量”。
“volatile”的含義是“請不要做沒譜的優(yōu)化,這個值可能變掉的”,而并非“你可以修改這個值”。
因此,它們本來就不是矛盾的。
const修飾的變量不允許這里修改不代表不允許別處修改,比如:
int i = 5;
const int* p = &i;
*p = 6; // 不可以;
i = 7; // 完全可以,而且那個“const”的“*p”也跟著變成了7。
對于非指針非引用的變量,const volatile同時修飾的意義確實(shí)不大。個人覺得。
需要明白“volatile”的含義并非是“non-const”。所以他們才可以放在一起。
在C++語言中,const沒有反義詞,如果一個變量沒有const修飾,那它本身就是const的反義詞,而并非加上volatile才是const的反義詞。
兩者同時修飾一個對象的典型情況,是用于驅(qū)動中訪問外部設(shè)備的只讀寄存器。
留一個問題:const volatile int i=10;這行代碼有沒有問題?如果沒有,那 i 到底是什么 屬性?
回答一:沒有問題,例如只讀的狀態(tài)寄存器。它是volatile,因?yàn)樗赡鼙灰庀氩坏降馗淖?;它是const,因?yàn)槌绦虿粦?yīng)該試圖去修改它。volatile和const并不矛盾,只是控制的范圍不一樣,一個在程序本身之外,另一個是程序本身。
回答二:沒問題,const和volatile這兩個類型限定符不矛盾。const表示(運(yùn)行時)常量語義:被const修飾的對象在所在的作用域無法進(jìn)行修改操作,編譯器對于試圖直接修改const對象的表達(dá)式會產(chǎn)生編譯錯誤。volatile表示“易變的”,即在運(yùn)行期對象可能在當(dāng)前程序上下文的控制流以外被修改(例如多線程中被其它線程修改;對象所在的存儲器可能被多個硬件設(shè)備隨機(jī)修改等情況):被volatile修飾的對象,編譯器不會對這個對象的操作進(jìn)行優(yōu)化。一個對象可以同時被const和volatile修飾,表明這個對象體現(xiàn)常量語義,但同時可能被當(dāng)前對象所在程序上下文意外的情況修改。另外,LS錯誤,const可以修飾左值,修飾的對象本身也可以作為左值(例如數(shù)組)。
欄 目:C語言
下一篇:VC中Tab control控件的用法詳細(xì)解析
本文標(biāo)題:C語言 volatile與const同時使用應(yīng)注意的問題
本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/4140.html
您可能感興趣的文章
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用函數(shù)刪除字符
- 04-02c語言的正則匹配函數(shù) c語言正則表達(dá)式函數(shù)庫
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言中對數(shù)函數(shù)的表達(dá)式 c語言中對數(shù)怎么表達(dá)
- 04-02c語言用函數(shù)寫分段 用c語言表示分段函數(shù)
- 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排序法函數(shù)
- 04-02c語言沒有round函數(shù) round c語言
- 04-02c語言分段函數(shù)怎么求 用c語言求分段函數(shù)
- 04-02C語言中怎么打出三角函數(shù) c語言中怎么打出三角函數(shù)的值
- 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求階乘


閱讀排行
本欄相關(guān)
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言的正則匹配函數(shù) c語言正則表達(dá)
- 04-02c語言用函數(shù)寫分段 用c語言表示分段
- 04-02c語言中對數(shù)函數(shù)的表達(dá)式 c語言中對
- 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排
- 04-02c語言沒有round函數(shù) round c語言
- 04-02c語言分段函數(shù)怎么求 用c語言求分段
- 04-02C語言中怎么打出三角函數(shù) c語言中怎
- 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求
隨機(jī)閱讀
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 01-10C#中split用法實(shí)例總結(jié)
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 04-02jquery與jsp,用jquery
- 08-05織夢dedecms什么時候用欄目交叉功能?
- 01-11ajax實(shí)現(xiàn)頁面的局部加載
- 01-10delphi制作wav文件的方法
- 01-10使用C語言求解撲克牌的順子及n個骰子
- 08-05DEDE織夢data目錄下的sessions文件夾有什