const變數真的不能修改嗎?

來源:互聯網
上載者:User

昨天在寫程式時,突然想到了一個問題:const變數真的不可改變嗎?如果能改,應該怎麼改?於是乎,就決定動手操作一番,結果程式的結果有點出乎意料。但是最終還是得出了結論。如有不妥,歡迎各位拍磚!

下面就來看一下這個簡單的程式:

#include <iostream>using namespace std;int main(void){const int sum = 0;cout << "sum的初始值是:" << sum << endl;int *result = const_cast<int *>(&sum);*result = 20;cout << "sum的值現在是:" << sum << endl;cout << "result的值現在是:" << *result << endl;cout << "sum的地址是:" << &sum << endl;cout << "result的地址是:" << result << endl;getchar();return 0;}

程式的運行結果:

sum的初始值是:0sum的值現在是:0result的值現在是:20sum的地址是:0012FF60result的地址是:0012FF60

怎麼是這樣的結果:這下讓我有點迷茫,但是也感覺更有意思了。剛開始我覺得,只要使用指標指向這個const常量,就可以修改,結果發現這樣並不能修改const常量。通過程式的結果我們不難發現,result指向的地址確實是sum的地址,同樣的地址為什麼列印出來的值卻不一樣呢?原因是這樣的:對於這種const常量,其值在編譯期間是不知道的。這就意味著需要儲存空間,而編譯器不想保留它的符號表中的任何東西,而且一旦初始化,其值就不能改變。雖說result指向了sum的地址,可實際上指向的卻是sum常量的一個拷貝的地址。當再次使用sum時,就會發現sum的值並沒有被改變!

還有另一種情況:

#include <iostream>using namespace std;const int sum = 0;int main(void){cout << "sum的初始值是:" << sum << endl;cout << "sum的地址是:" << &sum << endl;int *result = const_cast<int *>(&sum);*result = 20;cout << "sum的值現在是:" << sum << endl;cout << "result的值現在是:" << *result << endl;cout << "sum的地址是:" << &sum << endl;cout << "result的地址是:" << result << endl;getchar();return 0;}

這種情況是編譯期間的const,通過實驗,這種方式修改const,程式根本不能運行,直接報錯。原因是這樣的:在這個程式中,sum是一個全域變數,C++編譯器不會為其分配空間,而是直接將其儲存在符號表中,待要取得const常量地址時,再迫使編譯器為其分配空間,所以,當result指向sum,並試圖修改其內容時就會出現:在此位置寫入時發生存取違規錯誤!

總結:所以通過這種方式,是不能修改const常量的!

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.