const關(guān)鍵字可以說是用途廣泛,從對變量的限定到對函數(shù)的限定,尤其是那個(gè)指向常量的指針(const int *p),指針常量(int * const p),指向常量的指針常量(const int* const p)更讓初學(xué)者摸不到頭腦。這里我主要想描述下最近項(xiàng)目中關(guān)于const的一個(gè)問題。簡單代碼如下:
int main()
{
const int a = 100;
int* p = (int *)&a;
*p = 200;
printf("\n%x\t%d", p, *p);
printf("\n%x\t%d", &a, a);
return 0;
}
VC 6.0 運(yùn)行結(jié)果:
12ff7c 200
12ff7c 100
我看了下跟蹤到內(nèi)存12ff7c里確實(shí)放著200,這讓我百思不得其解。于是我用gcc version 3.2.2 20030222
運(yùn)行結(jié)果如下:
bfffdee4 200
bfffdee4 200
那么經(jīng)過跟高手討教得出:
第二個(gè)PRINTF打印出的100不是當(dāng)時(shí)a的內(nèi)容,而是vc 6.0編譯優(yōu)化,看見const后,直接將100放在要打印的a的地方,類似于#define,所以輸出的還是100。那么最好的是使用volatile const int a = 100,一個(gè)定義為volatile的變量是說這變量可能會被意想不到地改變,這樣,編譯器就不會去假設(shè)這個(gè)變量的值了。精確地說就是,優(yōu)化器在用到這個(gè)變量時(shí)必須每次都小心地重新讀取這個(gè)變量的值,而不是使用保存在寄存器里的備份。所以。。。
經(jīng)過這個(gè)東西我看到了其實(shí)除了學(xué)習(xí)c++語言本身外,還是要了解一些編譯器的基本信息,是不是應(yīng)該開編譯選項(xiàng)之類的值得我們?nèi)ド钏肌?br>