在C中用const 能定義真正意義上的常量嗎?C++中的const呢?

不能。c中的const僅僅是從編譯層來限定,不允許對const 變量進行賦值操作,在運行期是無效的,所以並非是真正的常量(比如通過指針對const變量是可以修改值的),但是c++中是有區別的,c++在編譯時會把const常量加入符號表,以後(仍然在編譯期)遇到這個變量會從符號表中查找,所以在C++中是不可能修改到const變量的。
補充:

1). c中的局部const常量存儲在棧空間,全局const常量存在只讀存儲區,所以全局const常量也是無法修改的,它是一個只讀變量。
2). 這裏需要說明的是,常量並非僅僅是不可修改,而是相對於變量,它的值在編譯期已經決定,而不是在運行時決定。
3).c++中的const 和宏定義是有區別的,宏是在預編譯期直接進行文本替換,而const發生在編譯期,是可以進行類型檢查和作用域檢查的。
4).c語言中只有enum可以實現真正的常量。
5). c++中只有用字面量初始化的const常量會被加入符號表,而變量初始化的const常量依然只是只讀變量。
6). c++中const成員爲只讀變量,可以通過指針修改const成員的值,另外const成員變量只能在初始化列表中進行初始化。

下面我們通過代碼來看看區別。
同樣一段代碼,在c編譯器下,打印結果爲*pa = 4, 4
在c++編譯下打印的結果爲 *pa = 4, 8

int main(void)
{
    const int a = 8;
    int *pa = (int *)&a;
    *pa = 4;
    printf("*pa = %d, a = %d", *pa, a);
    return 0;
}

另外值得一說的是,由於c++中const常量的值在編譯期就已經決定,下面的做法是OK的,但是c中是編譯通不過的。

int main(void)
{
    const int a = 8;
    const int b = 2;
    int array[a+b] = {0};
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章