先對C語言中的const和C++中的const進行講解,前者const修飾的變數不是真的常量,它只是告訴編譯器該變數不能出現在賦值符號的左邊。後者C++在C的基礎上對const進行了進化處理。
1、C語言中的const
:
const
修飾的變數是唯讀,本質還是變數
const
修飾的局部變數在棧上分配空間
const
修飾的全域變數在唯讀儲存區配置空間
const
只在編譯期有用,在運行期無效
const
不能定義真正意義上的常量
const
修飾的變數不是真的常量,它只是告訴編譯器該變數不能出現在賦值符號的左邊。const
局部變數是在棧上分配空間,可以通過指標改變這個空間裡面的值。過了編譯期,const
變數的常量特性,唯讀特性就沒有了,唯讀特性只在編譯期有效,運行期根本無效。const
修飾的全域變數在唯讀儲存區配置空間,因此如果用指標去修改了const
修飾的全域變數,程式就會崩潰,因為修改了程式唯讀儲存區中內容,大部分程式都會發生崩潰。
2、C++中的const
:
C++在C的基礎上對const
進行了進化處理,具體表現在:
注意:C++編譯器雖然可能為
const
常量分配空間,但不會使用其儲存空間中的值
符號表是編譯過程中產生的一種資料結構
#include <iostream>#include <string>using namespace std;const int i = 10; // 如果通過指標去改變i,就會出現段錯誤:嘗試修改唯讀資料區資料int main(){ const int a = 5; int *p = (int *)&a; // &a, 給a標識符分配空間了,並用p指向了該空間, // 可以通過*p訪問這個地址,但是不能通過a來訪問 *p = 10; // 不能通過指標去改變a的值 cout << a << endl; cout << *p << endl; return 0;}
3、 與宏定義對比
C++ 中的const
常量類似於宏定義
const int c = 5;// 類似於#define c 5
但是cosnt
與宏定義的區別在於:
const
常量是有編譯器處理
編譯器對cosnt
常量進行類型檢查和範圍檢查
宏定義由前置處理器處理,只是進行單純的文本替換
#include <stdio.h>void f(){ #define a 3 const int b = 4;}void g(){ printf("a = %d\n", a); // 在g函數中訪問f函數中的宏定義,完全沒有問題 // 在預先處理的時候就進行了宏替換,對編譯器來說,就是printf("a = %d\n", 3); // 宏是沒有範圍的概念 // const 定義的常量,被編譯器處理,是有範圍的,不能訪問b printf("b = %d\n", b);}int main(){ const int A = 1; const int B = 2; int array[A + B] = {0}; /* C編譯 const修飾得到的只是具有唯讀特性的變數,數組的大小是由兩個變數的大小決定的, 兩個變數相加的結果需要在啟動並執行時候才能直到,因此編譯器編譯的時候不知道這個數組長度,直接報錯 */ /* C++編譯 const是定義的真正意義上的常量,直接從符號表中取值,編譯的時候就知道A和B的值, 可以得到數組的長度,不會報錯 */ int i = 0; for(i=0; i<(A + B); i++) { printf("array[%d] = %d\n", i, array[i]); } f(); g(); return 0;}
相關文章:
php中const與define的區別分析
相關視頻:
PHP底層分析視頻教程