今天偶然在群裡看到這樣乙個問題:
#include int main ()
求輸出結果,只要掌握const變數的一些知識應該會得出答案a=10,*p=20,但是這個題還有價值可究,如為什麼在偵錯程式中執行完後 a=20,*p=20呢?如圖,
為此群裡有個大神找到了這樣一篇文章
簡單介紹一下const變數,const是乙個修飾符,表示常量,即如果以後保證不會修改則宣告為const。
但是 就是有人想修改它的話也是有辦法的,就是給它加上volatile關鍵字(這裡不同於c語言的指標修改const變數,只是針對c++而言)。
const volatile int a =10;
const int a=10;
這兩句話有本質的區別,當宣告為
前者時輸出結果為a=20
.*p=20.
後者則為
a=10
.*p=20.
先引入這個概念幫助讀者加深理解——c++中的常量摺疊:指const變數(即常量)值
放在編譯器的符號表中
,計算時編譯器直接從表中取值,省去了訪問記憶體的時間,從而達到了優化。
當沒有volatile關鍵字時程式沒有進行優化,即程式編譯器是直接去符號表裡面取值而不是記憶體中,故a=10.
當存在volatile關鍵字時程式沒有進行優化(這和volatile關鍵字的功能有關讀者可以借鑑一下這篇文章程式是一步步執行的,如我前面一篇有關對於volatile的文章,他會促使編譯器一步步執行程式,所以當讀取a的值得時候,編譯器會從記憶體中讀取a=20.但對於不同的編譯器結果卻是不同的,vc++6.0會忽視這個關鍵字即還是進行了優化,輸出是a=10 *p=20。而vs系列則不會忽視volatile的存在。
故:建議不要修改const變數的值。
C 中修改const成員變數
在c 中,被const修飾的變數,表示其不可變。當然c 提供了型別轉換操作符const cast,用來將變數的const屬性臨時性地去掉。如果在乙個類裡面有乙個const成員變數,我們如何在成員函式中修改它呢?class test 那麼我們可以寫這麼乙個函式 void test seta int a...
修改const變數
宣告 不同於c語言的const變數修改問題 可以通過指標間接修改const變數的值 這裡只討論c 裡的const。c const 修飾符,表示常量,即如果以後保證不會修改則宣告為const,否則若要修改,那一開始為什麼還要宣告為const呢?根據c 標準,對於修改const變數,屬於 未定義行為 指...
C 中的 const 型別變數
之前總感覺c c 中有const 限定的變數是個很頭痛的問題,一會兒能夠變。一會兒不能夠變,一會兒把const賦給nonconst,一會兒又把nonconst賦給const,頭都被它搞大了。今天剛好把 c primer 中的相關部分又讀了一遍,所以就把相關的內容寫出來總結一下啦!首先,我們能夠想想為...