作者: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/