C 中const變數的修改

2021-06-30 16:31:27 字數 890 閱讀 7183

今天偶然在群裡看到這樣乙個問題:

#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 中的相關部分又讀了一遍,所以就把相關的內容寫出來總結一下啦!首先,我們能夠想想為...