【C++學習】const關鍵字釋疑

來源:互聯網
上載者:User

作者:gnuhpc
出處:http://www.cnblogs.com/gnuhpc/

我們先看看以下代碼:
#include <stdio.h>
int main()
{
const int a = 1;
a = 2;
printf("%d/n", a);
return 0;
}
你一看就知道這個一定在編譯的時候報錯:assignment of read-only variable a。
所以你知道了變數a被定義為const是唯讀而不能改變的,但事實是這樣的嗎?
請看下邊的代碼:
#include <stdio.h>
int main()
{
const int a = 1;
int *b = &a;
*b = 2;
printf("%d %d", a, *b);
return 0;
}
編譯發覺竟然通過了,結果你先猜猜,咱們先拿編譯通過這個事情說事。
你設定一個變數為const時,編譯器就會拍拍胸脯的告訴你這個記憶體位址的值通過這個變數名字是不會被改變的,但請注意它仍然可以被任意外部程式甚至是同一個程式的其他名字而更改。
那我們現在看看到底這個程式的結果是什麼:
2 2
其實這個程式的結果沒有任何代表性,我用的是GCC4.2.4,這並不代表所有編譯器都是這樣的結果,就相當於並不是VC就是C/C++語言一樣。我們看看C語言的標準是怎麼說的:
If an attempt is made to modify an object defined with a const-qualified type through use of an lvalue with non-const-qualified type, the behavior is undefined.
那就是說這事還沒準兒呢!
那我們還使用const有什麼用呢,既然它也可以被更改,而且結果還不確定。
簡要來說有以下兩個主要用途:
1.防止程式無意中錯誤的修改了一些只需對其進行訪問的變數。
2. 使編譯器知道這個值是不會改變的,它會因此對你的程式有所最佳化。它最佳化的方式主要有兩種:一個是將變數值同時寄存於寄存器中,這樣即使通過*b修改了a,讀取它的值時還是會去讀寄存器中原來的值。第二個是,它甚至會在所有程式中用到a的地方將變數a替代為設定的常量值,比如這個程式中就是1。
這下你明白了吧,以後不要聽磚家(比如說我)亂說,自己去翻翻ANSI C的標準。

作者:gnuhpc
出處:http://www.cnblogs.com/gnuhpc/

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.